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 主要体现在两个方面,一个是编码习惯问题,另一个是编码质量的问题.编码习惯主要有日志编写.代码注释以及编码风格的问题,而编码质量则与很多方面相关,比如 ...
随机推荐
- 【Javaweb学习笔记】XML和约束模式
一.XML语法 xml 可扩展标记语言,w3c组织发布的,用于保存有关系的数据,作为配置文件,描述程序模块之间的关系 xml 文件开头必须包括下面的标签: <?xml version=" ...
- ASP.Net MVC 引用动态 js 脚本
希望可以动态生成 js 发送给客户端使用. layout页引用: <script type="text/javascript" src="@Url.Action( ...
- 【一头扎进Spring】 01 | 从 HelloWorld 开始看Spring
Spring 是一个开源框架. Spring 为简化企业级应用开发而生. 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能. Spring 是一个 IOC(DI ...
- vPlayer 模块Demo
本文出自APICloud官方论坛 vPlayer iOS封装了AVPlayer视频播放功能(支持音频播放).iOS 平台上支持的视频文件格式有:WMV,AVI,MKV,RMVB,RM,XVID,MP4 ...
- 第一篇:python中的判断语句和循环
python与C语言的代码格式区别: 需注意:1.python中语句结束没有分号 “;” 2.python中严格要求缩进,且在判断和循环等语句中把括号用冒号代替. 3.经常使用tab键进行缩进. 4. ...
- Python工具类(二)—— 操作时间相关
#!/usr/bin/env python # -*- coding: utf-8 -*- """ __title__ = '操作时间的工具类' "" ...
- Oracle Autonomous Health Framework (AHF) 解读
AHF介绍 Oracle在2019年10月18日发布自治健康框架Autonomous Health Framework (AHF) 19.3,将ORAchk,EXAchk,TFA三种诊断工具合并入AH ...
- 打包一份py给大家用!!!
好不容易写完了代码,却发现对面无法使用自己的python代码,其无奈可想而知 在这里就给大家介绍一下pyinstaller的简单用法 你所需要的就是在电脑上安装好 https://blog.csdn. ...
- 洛谷 P5424 [USACO19OPEN]Snakes
题目链接 题目描述 传说,数千年前圣帕特里克消灭了哞尔兰所有的蛇.然而,蛇们现在卷土重来了!圣帕特里克节是在每年的3月17日,所以Bessie要用彻底清除哞尔兰所有的蛇来纪念圣帕特里克. Bessie ...
- HTML5 App商业开发实战教程 基于WeX5可视化开发平台