来源:http://www.vbgamedev.com/OTHER/pz.htm
动力学模拟基础—细长杆
BY:张皓(ZH1110)
动力学是以牛顿运动定律为基础全面的研究物体的运动与作用与物体上的力的关系,其对象被理想化为质点和质点系,研究刚性、弹性碰撞,当然也包括变形的固体和流体。借助与计算机可模拟各种真实的运动,如飞机在天空受空气阻力及惯性作用下的飞行姿势,筛子落到桌面后的滚动等均可用其模拟,对于现代游戏开发具有一定意义。
本章介绍了动力学中刚性运动的模拟过程,碰撞采用离散碰撞检测算法。
首先我们研究细长杆的运动,查物理用表或积分得到细长杆运动时惯性量度,当我们已知刚体受的力矩(或外力)就可通过其求解出运动规律。
细长杆在未受任何外力的情况下属于平面运动(可以看作是在宇宙空间中),其任意点角度位置是相对于重心的单值连续函数,具此可求出所有离散点上细长杆两端点位置:
D3DXVec3Add l.p, l.p, l.V '平动的位置
l.ang = l.ang - l.angv '转动角度,这里我们假设顺时针旋转为正方向
l.ver1.x = l.p.x + Cos(l.ang) '第一个端点的位置(不妨设杆长为2)
l.ver1.y = l.p.y + Sin(l.ang)
l.ver2.x = l.p.x - Cos(l.ang) '第二个端点的位置
l.ver2.y = l.p.y - Sin(l.ang)
细长杆刚体的动能包括平动的动能和转动的动能,当其与其他物体发生碰撞后两个动能都会发生改变,但总动能与动量是平衡的
如计算杆与地面碰撞,因地面的质量无限大,不吸收动能,碰撞后杆完全反弹,得到第一个式子:
1.
这个式子有两个未知量,求解还须其他方程.
如图,我们假设碰撞生产的力为F,作用时间为t,杆质量为M. 力F可分解为作用于重心力矩和对杆产生平移的力.
得到第二,第三个式子:
2.
3.
现在通过以上三个式子求解碰撞后的速度V'及角速度ω':
将2,3两式削去Ft/M,合并得:
将ω'代入第一个方程,简化方程...
最后,用求根公式解出我们所要的速度V',再用V'去求我们需要的其他两个答案:
式中d为重心到撞击力的垂直距离,可以通过两个单位向量的点积求出,从中我们还可看到结果与物体的质量并无直接的关系。改变相应旋转半径数值,公式也可适用于非细长杆物体.
杆与杆之间的碰撞:
杆与杆之间的碰撞与上面类似,动能平衡方程应建立在两个杆上,且因为作用力与反作用力的关系,受反作用力一方F取负值
建立方程组如下:
计算得到的V1'如下,代入另几个方程计算出需要的其他答案
计算碰撞的精确位置
我们检测到的状态两杆已经相交,但我们需要的是碰撞一刹那或即将发生碰撞的位置,这可通过二分法计算,对于任意状态:
1.判断如果已经相交则两杆状态向后T=T/2周期
2.判断如果未相交则两杆状态向前T=T/2周期
3.计算误差是否达到允许值,如果达到退出循环
4.转到过程1
经过几次的细分计算后误差就基本达到我们的要求了
有待解决的问题:当一杆穿过另一杆即发生'刺穿'现象,程序未检测到相交,产生错误的判断,对于扁平的物体这个问题尤其突出,考虑使用连续算法进行辅助的计算。还有一个问题既当多个物体同时发生碰撞时不能很有效的处理。
尽管离散碰撞检测算法存在一些问题,但由于其检测过程的快速性能较好,所以仍是目前碰撞检测算法研究的重点。
最后,如果有什么问题(本文包括代码)可以告诉我(ZH1110)。