SPH液面重构过程中的问题
使用粒子方法进行流体特效模拟需要进行液面重构,构造出流体的自由表面,液面重构方法也是一个独立的研究方向,针对其的研究已经有了很多成果,包括液面的平滑度、精度和并行效率等。
在这里,主要是记录一下我在液面重构实现过程遇到的问题。
SPH的液面重构部分,我使用的是有向距离场方法(Animating Sand as a Fluid),这是一种简单有效的液面重构方法。目前针对有向距离场方法已经有了一些改进方案,如A Unified Particle Model for Fluid-Solid Interactions等。
这里的距离场是为了计算流体的隐式表面。
关于这个方法,我在实现过程中遇到了一个问题,液面在某些情况下存在一些缺口,如下:

流体上方出现了一个缺口,在低精度(单元格精度0.05)表面下可以明显看到。
粒子视图下流体为:

两个视图分别为流体第5次迭代和第800次迭代后的状态。
为了定位这个BUG,在调试时,我对距离场网格进行了一些定制,如单元格边长设为0.05,距离场网格起点设为(-0.2,-0.2,-0.2),然后对距离场规模进行了控制。
通过调试,我找到了出现问题的网格单元,并且发现单元格顶点存在问题,在8个单元格顶点中有4个缺失了。在我的实现过程中,是通过空间中的坐标进行单元格顶点的搜索的。
单元格顶点缺失的原因是:通过对哈希表的遍历,对顶点进行索引时,未能找到哈希表中的此坐标下的顶点,但哈希表中确实存在这个顶点,即查找时未能辨明这个顶点。
在更准确的定位问题点后,我发现错误的根本原因是数据的精度问题,即double值的精度问题。顶点坐标使用的是double类型数据,在查找顶点时,通过判断当前坐标是否等于哈希表中的顶点坐标,如果等于则表明此顶点是需要搜索的顶点。
如下是出现BUG的位置:
if (this->x == gc.x && this->y == gc.y && this->z == gc.z)
{
return false;
}
改进之后为:
const double delt = 0.000000001;
if (abs(this->x - gc.x) < delt && abs(this->y - gc.y) < delt && abs(this->z - gc.z) < delt)
{
return false;
}
使用double数据进行判断时,double值在计算累积过程中可能会出现精度缺失,通过设定一个阈值进行一定精度范围下的等于判断,可以在一定程度上解决这个问题。从整体来看,液面重构出现BUG的原因与算法本身是没有关系的,根本原因是数据精度的问题。
改进后的液面(单元格精度0.008)如下:

渲染(blender):

这里暂时先省略液面重构实现方案的部分,只是记录一下偶然遇到的这个问题。
SPH液面重构过程中的问题的更多相关文章
- SPH流体模拟及液面重构问题
关于流体特效模拟算法的简单描述,前提部分. 目前动画领域内的流体模拟主要是拉格朗日法无网格法和欧拉网格法,两种方法更有利弊. 我研究的主要是拉格朗日法中的SPH模型,即光滑粒子流体动力学模型. 粒子方 ...
- 根据自己的需要,把别人开发好的东西搬过来,优化and重构,在优化的过程中,甚至也会弄出一套全新的东西(转)
赵海平在今年三月份来到阿里,听毕玄(他现任主管)说去年五六月份就跟赵海平聊上了.有人问:为啥 BAT 三大巨头,你看中了阿里巴巴?在今天现场达一千多人的分享中赵海平给出了回复:“因为百度和腾讯没找我呗 ...
- Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成
前言 Rafy 领域实体框架作为一个使用领域驱动设计作为指导思想的开发框架,必然要处理领域实体到数据库表之间的映射,即包含了 ORM 的功能.由于在 09 年最初设计时,ORM 部分的设计并不是最重要 ...
- 从输入 URL 到浏览器接收的过程中发生了什么事情
从输入 URL 到浏览器接收的过程中发生了什么事情? 原文:http://www.codeceo.com/article/url-cpu-broswer.html 从触屏到 CPU 首先是「输入 U ...
- 重构 ORM 中的 Sql 生成
Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成 前言 Rafy 领域实体框架作为一个使用领域驱动设计作为指导思想的开发框架,必然要处理领域实体到数据库表之间的映射,即包含了 OR ...
- PF2.1版本总结,在设计过程中遇到的问题以及技术分享
在距离上一次的版本发布已经过去4个月的时间,因为个人的能力以及时间有限,所以这次的版本会推迟这么久.可是无论怎样,PF2.1带着自身的完善总算不负所望推出.在这次的版本调整中让我深有体会到了程序设计中 ...
- CEO 系列之一:如何当好创业公司 CEO?(不要用战术的勤奋掩盖战略的懒惰,在创业过程中,最核心问题,就是能把创业情怀变成具体问题。这个问题越具体越好)
1. 创业公司要先定一个目标,要善于把目标简化, 分解成一个, 一个更具体,更简单的问题2. 针对简单的问题进行聚焦, 做深做强3. 在做的过程中, 把断地推出自己的产品到市场上去试错, 要用事实来证 ...
- 常见Code Review过程中发现的问题-续
上一篇列举了一些比较常见的Code Review问题列表,文末有链接,可追溯查看.本篇为上篇的姊妹篇,继续列举一些上篇遗漏的或不易发现的问题清单,希望能整体性把一些常见的问题表述出来. 测试数据不具有 ...
- 常见Code Review过程中发现的问题
软件环境:Spring MVC + MyBatis 主要体现在两个方面,一个是编码习惯问题,另一个是编码质量的问题.编码习惯主要有日志编写.代码注释以及编码风格的问题,而编码质量则与很多方面相关,比如 ...
随机推荐
- String类方法的使用
String类的判断功能: boolean equals(Object obj) //比较字符串内容是否相同(区分大小写). boolean equalsIgnoreCase(String str) ...
- 一步一步教你PowerBI利用爬虫获取天气数据分析
对于爬虫大家应该不会陌生,我们首先来看一下爬虫的定义:网络爬虫是一种自动获取网页内容的程序,是搜索引擎的重要组成部分.网络爬虫为搜索引擎从万维网下载网页,自动获取网页内容的应用程序.看到定义我们应该已 ...
- Java动态编译技术原理
这里介绍Java动态编译技术原理! 编译,一般来说就是将源代码转换成机器码的过程,比如在C语言中中,将C语言源代码编译成a.out,,但是在Java中的理解可能有点不同,编译指的是将java 源代码转 ...
- struts2 convention插件
1.struts2自2.1以后推荐使用Convention Plugin支持struts零配置支持(引入jar:struts2-convention-plugin-2.x.x.jar)①convent ...
- Python思维导图(二)—— 数据类型
============================================== =========可点击图片, 放大查看更清晰哦!========= ===========有任何错误请及 ...
- 简述http协议及抓包分析
1:HTTP请求头和响应头的格式 1:HTTP请求格式:<request-line><headers><blank line>[<request-body&g ...
- Ansible Playbooks常用模块
File模块 在目标主机创建文件或目录,并赋予其系统权限 - name: create a file file:'path=/oot/foo.txt state=touch mode=0755 own ...
- 大叔 Frameworks.Entity.Core 2 PageList
Frameworks.Entity.Core\Commons\PageList\ 1 分页通用类 ListPageList<T> 继承 PageListBase<T>, IP ...
- quick-cocos2d-x项目《狂点小怪兽》总结
最近找了个公司实习,领导让我把公司的<狂点小怪兽>C++游戏用Lua重写.大概用了一个星期完成. 第一次使用quick-cocos2d-x,磕磕碰碰的也算是走了一遍流程. 1. quick ...
- GP工作室——系统设计
团队作业第二次--系统设计 问题 答案 这个作业属于哪个课程 软件工程 这个作业要求在哪里 作业要求 团队名称 GP工作室 这个作业的目标 对项目软件进行更为详细的系统性设计 按照本游戏的设计要求,我 ...