速度ベクトルに沿って移動している発射体オブジェクトがあります。オブジェクトが常に速度ベクトルの方向を向いていることを確認する必要があります。さらに、行列ではなくクォータニオンを使用してオブジェクトの回転を表現しています。
最初のステップは直交基底を見つけることであることを私は知っています:
forward = direction of velocity vector
up = vector.new(0, 1, 0)
right = cross(up, forward)
up = cross(forward, right)
基底を回転クォータニオンに変換するにはどうすればよいですか?
解決
注:答えを提供してくれたNoel Hughesの功績を称えたいと思いますが、私自身の経験から明らかにしたいと思います。擬似コードは次のとおりです。
vec3 vel = direction of velocity vector
vec3 forward = (1, 0, 0) // Depends on direction your model faces. See below.
vec3 axis = cross(forward, vel)
if (axis == 0) then quit // Already facing the right direction!
axis = normalize(axis)
float theta = acos(vel.x/sqrt(vel.x^2, vel.y^2, vel.z^2))
quat result = (0, axis.y * sin(theta/2), axis.z * sin(theta/2), cos(theta/2)
クォータニオンの最後の要素はスカラー部分であり、最初の3つの要素は虚数部分です。また、上記の擬似コードは、「モデル空間」内のオブジェクトが正のx軸を指していることを前提としています。私の場合、オブジェクトは実際には正のy軸を下に向けていました。この場合、次の変更を行いました。
vec3 vel = direction of velocity vector
vec3 forward = (0, 1, 0) // Note that y-component is now 1
vec3 axis = cross(forward, vel)
if (axis == 0) then quit
axis = normalize(axis)
float theta = acos(vel.x/sqrt(vel.x^2, vel.y^2, vel.z^2))
quat result = (axis.x * sin(theta/2), 0, axis.z * sin(theta/2), cos(theta/2)
// Note that SECOND component above is now 0