0

3D 空間で機銃掃射できるように、既に回転行列を計算したオブジェクトの get Right ベクトルを見つけようとしています。これまでに私は得た

    glm::quat gOrientation2 = glm::quat(glm::radians(entity.orientation));
    glm::mat4 RotationMatrix = glm::mat4_cast(gOrientation2);
    entup = glm::vec3(RotationMatrix[1][0], RotationMatrix[1][1], RotationMatrix[1][2]);
    entforward = glm::vec3(RotationMatrix[2][0], RotationMatrix[2][1], RotationMatrix[2][2]);
    entright = glm::vec3(RotationMatrix[0][0], RotationMatrix[0][1], RotationMatrix[0][2]) ;    

もう少し見つめた後、問題が実際にそこにあるかどうかを考えながら、左右に移動するハンドラーを投稿しています。

//the (10, -10, 10) vec3 is just a generic speed that moves 
//it forward then multiplied by dir.
if (glfwGetKey(65) == GLFW_PRESS){
    if(entity.player == 1)
        entity.position += glm::vec3(10,-10,10)*entright*deltaTime;
}
if (glfwGetKey(68) == GLFW_PRESS){
    if(entity.player == 1)
        entity.position -= glm::vec3(10,-10,10)*entright*deltaTime;
}

ピッチングとヨーイングのみを行う限り、これは正常に機能しています。オブジェクトが回転しようとするとすぐに、正しいベクトルが本来あるべき場所から 90 度向きます。RotationMatrix の最初の行を抽出して Right も取得できることはわかっていますが、上記のコードと同じ結果が得られます。

問題を説明する画像 http://img442.imageshack.us/img442/5046/directionexample.jpg

4

1 に答える 1

0

四元数を乗算する順序は混乱しています。変更してみる

glm::quat gOrientation2 = rY*rX*rZ;

glm::quat gOrientation2 = (rX*rY)*rZ

あなたが言うように、クロス積を行う意味はありません。回転行列から直接正しいベクトルを取得するだけです。

これは、 glm を使用してオイラー角を四元数に変換し、次に回転行列に変換する最も効率的または簡潔な方法ではありません。glm にはこのための関数が組み込まれています。ドキュメントを確認してください。

于 2013-04-16T18:33:18.470 に答える