任务
1.更新位置、姿态与速度
2.碰撞检测
3.碰撞反馈
实现
更新位置、姿态与速度
对于速度的更新,采用显式的方法,对于位置的更新,采用隐式的方法。就是103中讲的两只青蛙的例子。
需要同时更新线速度和角速度。线速度受到重力的影响,因此每次更新都要加上重力造成的速度影响,同时还需要乘上速度的衰减量。角速度的更新,也是乘上衰减量。
位置和姿态的更新。对于位置的更新较简单。
姿态的更新,涉及到四元数的运算。更新四元数时,和矩阵相乘叠加旋转效果一样,左乘一个四元数。而四元数的求解是通过下面的式子求得。因为计算三角函数性能开销会变大,这里的角度非常小,因此可以通过近似的方法求得近似的q = [1 , Δt/2*w]
叠加两次旋转,为 [1 , Δt/2*w] *q ,将[1 , Δt/2*w]分解成 1 + [0 , Δt/2*w],再将q乘进来就得到了103给的式子。这里代码就直接按103的式子实现了
v += dt * gravity;
v *= linear_decay;
w *= angular_decay;
//Update linear status
Vector3 x = transform.position + dt * v;
//Update angular status
Vector3 dw = w * dt / 2.0f;
Quaternion qw = new Quaternion(dw.x,dw.y,dw.z,0.0f);
Quaternion q = transform.rotation;
Quaternion qw_q = qw *q;
q = new Quaternion(q.x + qw_q.x , q.y + qw_q.y , q.z + qw_q.z , q.w + qw_q.w);
// Part IV: Assign to the object
transform.position = x;
transform.rotation = q;
碰撞检测
先判断点是否已经进入了物体内部,如果在物体内部,再考虑是否还有往内部运动的趋势,说明需要进行碰撞反弹处理。这里较简单。
当有多个点满足需要碰撞反弹处理时,需要对这些点求一个平均位置,再用平均的位置来进行之后的计算。
MeshFilter meshFilter &