我是一名接触计算机图形学不久的学生了解到许多真实游戏开发的内情,受益匪浅
1. 3中提到的Euler方法和Verlet方法

其实Euler方法本身有许多变种,稳定性无法一概而论,您讨论的似乎是最简单的explicit Euler方法,这个方法确实是存在比较大的数值稳定性问题的,表现为系统能量会持续增加而不守恒(比如弹簧振子振幅越来越大,或者围绕恒星的天体轨道越来越往外等)。除此之外还有Symplectic EulerLinearized Implicit EulerImplicit Euler这些。我原本不了解这里提到的Verlet方法,从公式上出发似乎就是Symplectic Euler方法:
首先为方便起见假设d = 1.0
则有 x(t+dt) = x(t) + (x(t) - x(t-dt)) + a(t)*dt^2
移项就是x(t+dt) - x(t) = x(t) - x(t-dt) + a(t)*dt^2
x(t) - x(t-dt)/dt定义为v(t),则有
x(t+dt) - x(t) = (v(t) + a(t)*dt)*dt
左边应等于v(t+dt) * dt,因此化简得
v(t+dt) = v(t) + a(t)*dt
这个式子与explicit Euler的区别就在于explicit是先用当前的v更新了x,再用当前的a去更新v的顺序,而此式是相当于先用a更新了v之后再用这个v去更新x。(除此之外还节约了存储v的空间)
Symplectic Euler(Verlet?)确实比explicit Euler要稳定一些,但仍然没有完全解决稳定性问题(实际中仍然会出现能量不守恒),通过改进Symplectic Euler可以严格地保证数值积分本身的稳定性,就是Linearized Implicit EulerImplicit Euler了,不过他们增大了计算量,并且不是所有时候都能得到力的显式表达形式,所以适用面似乎很小(不太了解实际工程中的用途)。

2. 头发的处理

日志中第6部分为了处理头发弯曲时应该有抵抗弯曲的能力的问题,采用了增加弹簧约束的方法,不过增加弹簧的方法对于头发这样的弹性体其实并不是很适用,因为大多数情况下头发的角度接近直线,扭角很小,此时附加的弹簧的长度随扭角的变化率不高,不能有效地约束头发的扭曲程度:
http: // www.wolframalpha.com/input/?i=y+%3D+2+-+2*cos%28PI-theta%29+from+theta+%3D+0+to+PI%2F4
大体上画了一下一个用来约束头发保持180度直线的弹簧在偏移时的长度变化(长度的变化量和力成正比),在扭角不大时变化率不大,扭角大时变化率较大,这就导致如果把弹簧的弹性系数K设小了,就容易发生振动(因为扭角小时约束不住,一下子运动到扭角大的时候反馈又太强了);如果把K设大了就要求时间间隔dt要小,否则数值上不稳定,我觉得您后来出现的头发弹来弹去的原因就在这里。不过您使用的三角形网格使得弹簧原本都有一个角度,应该是已经缓解了一部分这个问题
其实似乎可以用利用对弹性体处理的方法,直接约束扭曲的角度,我自己的实验效果会好不少,假设扭曲后的弹性势能w是扭角theta(或者扭角与静止状态下扭角的差)的平方,则通过w对构成一段扭曲的三个顶点的坐标的偏导可以计算出三个点应当受到的力的大小。这里计算角度时原则上可以用atan, asin, acos都行,但是由于atan的偏导数不含开平方根,应该在计算上会快一点。这样就可以直接约束扭曲的角度了,可以提高数值的稳定性,并且系统的结构也会简单一些。(不过我觉得您的同心球约束的方法也很赞!从表现上来说也不错的)


下一篇: 这种情况看做幂等吗?
上一篇: “转账”真的是“取款”和“存款”的组合吗?
标签:

欢迎转载,转载时必须以链接形式注明来自 【南京典乐科技】
专业服务:南京网站建设,南京网站制作,南京网站设计,南京网站制作公司
咨询电话:13851941123(7*24小时在线服务)
公司网址:本文地址:http://m.025app.com/news/detail_192.html

 
公司简介 | 联系我们 | 知识中心
Copyright © 南京典乐科技 版权所有
苏ICP备12085975号
首页
咨询电话
联系我们