2010年2月7日
#
目前流体模拟中常用的2种方法,分别代表了从2种不同的方面来解释Navier-Stokes的流体方程Eulerian从空间固定点观察该点的值得变化,这就是Navier-Stokes方程中第一项是速度V(x,y,z,t)关于时间的偏导数的物理意义,也就是当取定向量或者数量场的空间一点坐标后,固定观察该点得数量或者向量值得变化。Lagrangian方法则将液体看作是跟随着流动的Particle,也因此对于一个Particle来说任何物理量不再是关于时间t的偏导数而是关于时间的全导数以速度场为例,速度关于时间地变化不再是Vt(x,y,z,t),而是Vt(x(t),y(t),z(t),t)很显然这时候Particle的速度和运动轨迹行成了一个微分方程组
X(t)' = Vt(x(t),y(t),z(t),z)的x分量;
Y(t)' = Vt(x(t),y(t),z(t),z)的y分量;
Z(t)' = Vt(x(t),y(t),z(t),z)的z分量;
这时候速度关于时间的全导数(也就是物理意义上的该Particle的加速度)就是Navier-Stokes方程的第一二项之和,如果根据求导链式法则展开DVt(x(t),y(t),z(t),t)/Dt可以看到正好等于这2项,因次实际上Eulerian和Lagrangian只是从不同的物理角度来看Navier-Stokes方程而已。
从2种方法的数值求解来看个人认为Eulerian比较容易理解,但是数值求解过于复杂需要使用中心差分来离散化公式中出现的梯度,而且最后为了求解个点处的压强,使得压强的梯度和速度的偏导数(2者都使用差分来离散化)满足关系外还有满足stokes公式所代表的液体不可压缩性,因此最后会搞出来一个很大的线性方程组,该方程组得大小取决于grid的数量,要求解这么大的方程组,需要很大的开销,因此这种方法只可能适合离线模拟,虽然真实性和精度都会比较高。
基于SPH的方法,个人认为这种方法比较聪明的一点再于,使用离散的Particle在场中的值来,插值出所有场中的该物理量的大小,因此该方法天生是解析型的,所以不用使用中心差分等离散化方法来计算偏导数,并且由于Particle质量和个数一定因此本身就具有质量守恒的特点,此外由于各点压强使用理想气体的状态方程来计算因此只和该点得密度温度有关,所余不需要求解上面的那种线性方程组,但是这样的损失就是不能保证不可压缩性了,不过在一般视觉模拟钟是观察不出来的,而且该方法非常易于实现,比较麻烦的是最后要使用一些方法 从粒子场中抽取出面的信息,比如marching cube等等。
很想做一下SPH的方法不过现在都变很懒了,基本就不想coding了,等过断时间调整一下希望能够还有力气能做一下
2010年1月29日
#
发生了些事情,我的内心第一次产生了迷茫感,我开始怀疑我当初选择游戏这个行业的正确性,对我这种名校本科,硕士毕业的学生来说,进入这样一个不会得到尊重的甚至会被别人认为不稳定的行业,是不是从一开始就错了。而且越来越发现这个行业缺乏研究性(至少在中国),根本无法发挥我的研究能力,同样发觉自己对于研究的兴趣原大于游戏,而对数学的应用的兴趣远大于研究,至少自己越来越觉得自己所擅长的数学等知识的应用绝不应该只限制与这么一个xx的行业。如果当初刚毕业的时候没有选择从IBM离开,如果当初去面试一下google,微软这类公司。我不知道是否应该重新规划自己的职业生涯但是好像又已经太晚了,现在能做的就是现走一步看一步了
2010年1月5日
#
有些私人事情要办,不管最后结果,我都会回来继续我的研究工作
2009年12月20日
#
在计算convex和Triangle Mesh的碰撞中由于最终碰撞的级别会被分解为convex-triangle之间的碰撞检测,因此如果一个convex同时和Triangle Mesh中的多个Triangle发生接触的时候会导致一些 接触点是不正确的(对于单个Convex-triangle是正确的对于convex-mesh却是不正确的)如图:

为了方便我画了2d的模式,蓝色和红色各代表一个三角形,绿色是一个凸多面体,在这一时刻绿色和红色会计算出那个蓝色箭头的法向量,而绿色和蓝色三角行会计算出灰色的法向量,红色的那个最近点对是在红色三角形的面上而,蓝色的是在蓝色三角形的一条边界上而这条边界是和红色共享的(图中表示的就是红蓝的交点),这样的边称为inner edge,在上图情况下这个在inner edge上的接触点应该被消除。
在看一张图:

同样这次接触点也存在inner edge 上但是这一次是正确的接触点应该被保留!,那么为什么会出现第一张图这样错误的接触点呢,关键在于convex在和蓝色三角形进行碰撞测试的时候并不知道红色三角形的存在,也就是说该最近点对只是对于蓝色三角形单独而言的,如果将红色三角形考虑在内,那么由于这条inner edge也包含于红色三角形,因此如果红色三角形的最近点并不在这个edge上,那么对于整体而言这个edge上的点均不是最近点,因此都应该被排除。
因此最终算法如下,首先定义一个avoid集合代表那些feature(顶点,边)应该会被排除,收集完所有接触点之后,分2个pass进行,第一遍扫描每一个三角形上的接触点,对于三角形的任一个顶点,如果没有出现在该三角形的最近点对中那么加入avoid集合,对于任意一条边如果没有出现在该三角形的最近点对中那么加入avoid集合,对于面而言永远不需要加入avoid集合(这是由凸面体的性质决定的),
第2个pass重新扫描所有接触点如果它不再avoid集合中那么作为正常接触点输出,否则抛弃。
使用这种方法 在我的测试中暂时还没有出现过任何由于inner edge导致的法向错误:如图

不过在测试中发现由于目前使用每帧增加一个的接触点缓存,这会导致物速度很大撞击时由于地面的反作用很大并且而且作用在一个点上,产生反转的角速度,因此有必要设计一个一次产生多个接触点的方法,不过我已经想好怎么做了,就暂且加入Todo list把,后面还要把concave和convex的cast完成,柔体vs刚体的碰撞算法,以及最近大致看了下的使用Cycled coordinate decent 方法计算IK的系统需要做
2009年11月26日
#
这段时间一直没有想到一个强壮而且快速的柔体vs刚体碰撞的算法,所以决定放一段时间在想,无聊中看了一些车辆模拟的小介绍,做了个现在比较流行的基于ray-cast的vehicle 模拟,当然因为感到raycast 并不好 它把整个车轮模拟成一个点了,越过障碍时会出现突然的上升和下降,所以我自己采用了convex cast 方法,下一步要做Concavemesh和convex的碰撞检测,估计会出现的问题是Mesh Inner Edge 会计算出不正确的法向量(由于基于当个的triangle 碰撞导致pentrate点不正确),不过我自己已经想好解决方案了,希望最后的效果能完美些,贴张我的小赛车嘿嘿

2009年11月21日
#
摘要: 这几天碰巧看到Gino 的 ppt<<Continuous Collision Detection: Progress and Challenges>>,里面讲了使用GJK方法来实现两个Convex的Cast方法,一开始以为很简单,而且正好在做车辆的模拟仿真,正好用这种方法来做车轮和地面的Cast,可是我想简单了,刚把自己写好的方法运用上去以后发现车身抖个不停,轮子还不停穿...
阅读全文
2009年10月3日
#
摘要: 根据Muller的论文<<Position based dynamic>>,我把基本的框架写好了,今天测试了一个Cloth底部固连一个刚体,整个系统运行的不错,还算逼真,后续还有无数工作要做比如柔体-刚体的碰撞算法,柔体-柔体的碰撞算法
阅读全文
2009年9月20日
#
摘要: 测试了一下NGS 和split impluse两种方法的Position Correction,感觉NGS虽然效果稍微好一些但是在某些极端情况下仍然存在oscillations现象(比如连接2个hing Joint的物体一个重0.1一个重1,然后将一个重10的物体砸向重0.1的那个),虽然oscillation幅度明显小于split impluse方法,但是由于该方法的非线性性质导致运算量很多,综...
阅读全文
2009年8月28日
#
摘要: 在模拟中由于timestep的关系,实际上是假定了一个系统的Jacobian矩阵在该时间步长timestep中是个常量,由此而得到的是一个关于约束的线性系统,也就是认为在(t,t+detat)时间段内该矩阵处处相等,但是实际上并非如此,该矩阵实际在这个时间段中一直是变化的,所以其实这是一个非线形的系统,应次timestep越大,导致使用线形系统描述非线性系统的误差越大,有时候就会出现比如铰链断裂的...
阅读全文
2009年8月9日
#
摘要: 一片很好的介绍有限元法在柔体模拟中的应用论文《 Real-time Volumetric Deformable Models for Surgery Simulation using Finite Elements andCondensation》有限元法的简单介绍《An Introduction to the Finite Element Method》有限元法一开始似乎运用在结构力学中比较多现...
阅读全文