2016-11-29 6 views
0

OpenGL(C++)で3D回転を実装しようとしています。 ローカルのものではなくグローバル(X、Y、Z)のオブジェクトを回転させる方法を探していました。3Dで回転を結合する

私はこの簡単な概念を発見した:

  1. を回転させたいオブジェクトのワールド変換行列に現地を取得します。
  2. この行列の逆行列を使用して、ワールド軸をローカル座標に変換します。
  3. 変換された軸を使用して、コード内で行っているように回転を計算します。

ので、私のようなものが作られた:それはすべてではない特別な場合には正常に動作します

//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); 

を! これを行う最も簡単な正しい方法を知ってもらえますか?

+0

グローバルシステムで回転させたい場合は、回転行列を元の行列の左に掛けてください。右に乗算すると、ローカルシステムに回転が生じます(列ベクトルを仮定します)。 –

+0

申し訳ありませんが、元のマトリックスはどういう意味ですか? my modelMatrix = TranslationMatrix * RotationMatrix * scalingMatrix; ここで、rotation = Rx * Ry * Rz; 次に頂点シェーダに送信します。 MVP =投影*ビュー* modelMatrix; –

+0

これを 'modelMatrix = RotationMatrix * TranslationMatrix * ScalingMatrix'に変更してください。これはグローバル座標系で回転します。これはあなたが望んだものですか? –

答えて

0

まず、オブジェクトを回転させるポイントを決めます。これはオブジェクトの中心です。これをローテーションポイントと呼ぶことにします。

1)

が原点に頂点を翻訳:

は今、オブジェクトの各頂点のために、我々は次の操作を実行します。これは、頂点から回転点を減算することによって行うことができます。たとえば、回転点が(5,10,20)の場合、頂点のx座標から5を減算し、頂点のy座標から10を減算し、頂点のz座標から20を減算します。

2) 3x3回転行列で回転を実行します。

3)頂点を回転点に戻します。最初のステップを元に戻し、頂点の座標に5,10、および20を追加します。

変換行列を使用するよりも簡単ですが、効率が悪い可能性があります。

+0

私は頂点を扱わない方が好きです。すべての頂点に適用される頂点シェーダに行列を送りたいだけです –