我用船编了一个简单的游戏,并且有基本的碰撞检测功能。但我正在努力计算碰撞的有效反应。
船舶旋转由四元数Q(w,x,y,z)表示。
它的位置是坐标P(x,y,z)。
表面上的碰撞是坐标C(x,y,z)。
碰撞后它将沿表面滑动的方向是单位矢量S(x,y,z)。
表面法线是单位矢量N(x,y,z)。
游戏有六个自由度,没有特定的世界“向上”方向。
如何计算适用于船舶的正确旋转,使其朝向方向S? *同时尽量减少船舶当地“向上”方向的变化。 任何伪代码或指向数学解释的指针都将非常感激。
目前我正在从滑动方向计算四元数并将其应用到船上,但显然“向上”方向未被保留。
:S
答案 0 :(得分:0)
<强>解决强>
现在正在运作。
通过计算两个向量之间的四元数(船舶的Fwd'方向和滑动向量(S)),然后将该四元数乘以当前的船舶旋转(Q)来解决。
// quaternion from two vectors
quat quat::fromtwovectors(vec3 u, vec3 v) {
vec3 w = cross(u, v);
quat q = quat( dot(u, v), w.x, w.y, w.z);
q.w += q.magnitude();
return normalize(q);
}