OpenGL(C++)で3D回転を実装しようとしています。 ローカルのものではなくグローバル(X、Y、Z)のオブジェクトを回転させる方法を探していました。3Dで回転を結合する
私はこの簡単な概念を発見した:
- を回転させたいオブジェクトのワールド変換行列に現地を取得します。
- この行列の逆行列を使用して、ワールド軸をローカル座標に変換します。
- 変換された軸を使用して、コード内で行っているように回転を計算します。
ので、私のようなものが作られた:それはすべてではない特別な場合には正常に動作します
//set the rotation matrix ti identity matrix
transformedModel->rotationMatrix = glm::rotate(glm::mat4(1.0f), float(0), glm::vec3(1, 1, 1)); //rotation matrix = identity matrix
//X-axis
glm::vec4 axis = glm::inverse(transformedModel->rotationMatrix) * glm::vec4(1,0,0,0);
axis = glm::normalize(axis);
transformedModel->rotationMatrix = glm::rotate(transformedModel->rotationMatrix, glm::radians(rotation.x), glm::vec3(axis.x, axis.y, axis.z));
//Y-axis
glm::vec4 axis2 = glm::inverse(transformedModel->rotationMatrix) * glm::vec4(0,1,0,0);
transformedModel->rotationMatrix = glm::rotate(transformedModel->rotationMatrix, glm::radians(rotation.y), glm::vec3(axis2.x, axis2.y, axis2.z));
axis2 = glm::normalize(axis2);
//Z-axis
glm::vec4 axis3 = glm::inverse(transformedModel->rotationMatrix) * glm::vec4(0,0,1,0);
axis3 = glm::normalize(axis3);
transformedModel->rotationMatrix = glm::rotate(transformedModel->rotationMatrix, glm::radians(rotation.z), glm::vec3(axis3.x, axis3.y, axis3.z));
updateModelMatrix(transformedModel);
を! これを行う最も簡単な正しい方法を知ってもらえますか?
グローバルシステムで回転させたい場合は、回転行列を元の行列の左に掛けてください。右に乗算すると、ローカルシステムに回転が生じます(列ベクトルを仮定します)。 –
申し訳ありませんが、元のマトリックスはどういう意味ですか? my modelMatrix = TranslationMatrix * RotationMatrix * scalingMatrix; ここで、rotation = Rx * Ry * Rz; 次に頂点シェーダに送信します。 MVP =投影*ビュー* modelMatrix; –
これを 'modelMatrix = RotationMatrix * TranslationMatrix * ScalingMatrix'に変更してください。これはグローバル座標系で回転します。これはあなたが望んだものですか? –