Position Correction
在模拟中由于timestep的关系,实际上是假定了一个系统的Jacobian矩阵在该时间步长timestep中是个常量,由此而得到的是一个关于约束的线性系统,也就是认为在(t,t+detat)时间段内该矩阵处处相等,但是实际上并非如此,该矩阵实际在这个时间段中一直是变化的,所以其实这是一个非线形的系统,应次timestep越大,导致使用线形系统描述非线性系统的误差越大,有时候就会出现比如铰链断裂的情况,解决该问题的方法有:
1:Baumgarte 这种放法在每一次构造Jacobian矩阵的时候将约束误差作为反馈参数,这种方法在自己的系统里已经采用
但是这种方法由于是采用检查后反馈的方式,应此断裂现象不可避免,虽然通过后面的反馈这种断裂在模拟若干步后可以被fix但是从视觉上来说怎又那么一小个时间段Joint是断裂的。
所以正确的方法是:Solve完整个系统的速度和位置以后,立即对约束进行校正。也就是说约束校正不再作为反馈,而是一个额外的步骤插入。
常用的方法有:
Pseudo Velocities
Modified Nonlinear Gauss-Seidel
Full NGS
可以参考http://www.gphysics.com/archives/35
我准备实现Pseudo Velocities 和 NGS
NGS 从原理上来说是通过一个外部的Newton循环加上一个内部的高斯-赛德尔迭代组成,将这2个合并为一个就是
while(iterator < max)
{
for(every constraint)
{
重新计算约束的雅可比(根据该约束所对应的2个物体的最新位置,转向,转动惯量)
重新计算约束错误(根据该约束所对应的2个物体的最新位置,转向)
Solve该约束后得到对应的lambda
根据该lambda跟新2个物体的位置和转向,当然还有转动惯量
}
}
Pseudo Velocities :
这个没什么好讲的,和普通的高斯-赛德尔迭代一样,整个jacobian矩阵在整个过程中保持
不变
http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=4&t=3583
1:Baumgarte 这种放法在每一次构造Jacobian矩阵的时候将约束误差作为反馈参数,这种方法在自己的系统里已经采用
但是这种方法由于是采用检查后反馈的方式,应此断裂现象不可避免,虽然通过后面的反馈这种断裂在模拟若干步后可以被fix但是从视觉上来说怎又那么一小个时间段Joint是断裂的。
所以正确的方法是:Solve完整个系统的速度和位置以后,立即对约束进行校正。也就是说约束校正不再作为反馈,而是一个额外的步骤插入。
常用的方法有:
Pseudo Velocities
Modified Nonlinear Gauss-Seidel
Full NGS
可以参考http://www.gphysics.com/archives/35
我准备实现Pseudo Velocities 和 NGS
NGS 从原理上来说是通过一个外部的Newton循环加上一个内部的高斯-赛德尔迭代组成,将这2个合并为一个就是
while(iterator < max)
{
for(every constraint)
{
重新计算约束的雅可比(根据该约束所对应的2个物体的最新位置,转向,转动惯量)
重新计算约束错误(根据该约束所对应的2个物体的最新位置,转向)
Solve该约束后得到对应的lambda
根据该lambda跟新2个物体的位置和转向,当然还有转动惯量
}
}
Pseudo Velocities :
这个没什么好讲的,和普通的高斯-赛德尔迭代一样,整个jacobian矩阵在整个过程中保持
不变
http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=4&t=3583
fish.shadow song 若愚.影歌
posted on 2009-08-28 23:02 fish.shadow song(若愚.影歌) 阅读(305) 评论(0) 编辑 收藏 举报