7

私が持っているゲームで車を左に 90 度回転させたいです。

このコードを使用すると:

            glm::quat rot(info.Rotation.w,info.Rotation.x,info.Rotation.y,info.Rotation.z);
            glm::quat done(glm::rotate(rot,glm::eulerAngles(rot)+glm::vec3(90.0f,0.0,0.0)));
            info.Rotation.x = done.x;
            info.Rotation.y = done.y;
            info.Rotation.z = done.z;
            info.Rotation.w = done.w;

車が変な回転をします。

ただし、次のコードは車の回転をまったく変更しません (GLM がゲームの quats と互換性があることを確認するためだけに、私が期待したとおりです)。

            glm::quat rot(info.Rotation.w,info.Rotation.x,info.Rotation.y,info.Rotation.z);
            glm::quat done(rot);
            info.Rotation.x = done.x;
            info.Rotation.y = done.y;
            info.Rotation.z = done.z;
            info.Rotation.w = done.w;

そして、回転がそれで変更されたかどうかを確認するためにこれを試みるたびに:

            glm::quat rot(info.Rotation.w,info.Rotation.x,info.Rotation.y,info.Rotation.z);
            glm::quat done(glm::rotate(rot,vec3(0.0,0.0,0.0)));
            info.Rotation.x = done.x;
            info.Rotation.y = done.y;
            info.Rotation.z = done.z;
            info.Rotation.w = done.w;

車の回転は、ゲーム内で 0,0,0,0 回転に設定されています。次のコードは車を左に 90 度回転させると予想していたので、このコードでは回転はそのままであると予想していました。

            glm::quat rot(info.Rotation.w,info.Rotation.x,info.Rotation.y,info.Rotation.z);
            glm::quat done(glm::rotate(rot,vec3(90.0,0.0,0.0)));
            info.Rotation.x = done.x;
            info.Rotation.y = done.y;
            info.Rotation.z = done.z;
            info.Rotation.w = done.w;

しかし、それは私が望むようには機能しません。「回転」に追加するのではなく、回転を設定するだけです。

私は何を間違っていますか?

4

3 に答える 3

0

ジンバルロックを気にしないなら、これでうまくいくはずです。

glm::quat rot(info.Rotation.w,info.Rotation.x,info.Rotation.y,info.Rotation.z);
glm::quat rot_euler_angles = glm::gtx::quaternion::eulerAngles(rot);
rot_euler_angles.x += 90;

glm::quat done(glm::rotate(rot,rot_euler_angles));
info.Rotation.x = done.x;
info.Rotation.y = done.y;
info.Rotation.z = done.z;
info.Rotation.w = done.w;

これも有効だと思います

glm::vec3 rot(90.0*(float)M_PI/180.0, 0, 0);
info.Rotation = glm::normalize(info.Rotation * glm::quat(rot));

クォータニオンは、合成して非常に複雑な回転を作成できるため、優れています。

于 2013-08-02T20:26:34.053 に答える