0

3D 空間に (OpenGL を使用してすべてをレンダリングする) 同じタイプのクラスの 2 つのオブジェクトがあります。これらのオブジェクトは、xyz オフセットと、標準の 4x4 回転行列を表す回転行列を格納します。

簡素化された例:

class object {
  float rotMatrix[16];
  float xyzTrans[3];
  //a displaylist for drawing the object
}

UI コントロールに GLUI を使用しているため、変換をフォーマットで簡単に保存できます。

問題: あるオブジェクトに対して、他のオブジェクトに対して「正しい」向きを定義する必要があります。たとえば、最初のオブジェクトが z 軸の真下を向いていて、2 番目のオブジェクトが同じで、x 軸を中心に約 45 度回転している場合、これは「正しい」と見なされ、関数は必要なことを実行します。 . もちろん、これは異なる可能性があります。おそらく、同じ z でも x と y で回転したり、各軸を中心に少し回転したりすることさえあります。「正しい」回転の定義は、比較のためにオブジェクトに保存されます。

理想的には、次のようなことをしたいと思っています:

bool checkRotation(object* first, object* second) { 
   //do some comparison stuff

   if (eachCheck < someTolerance)
      return true;
   return false;
}

2つの回転行列を比較することでこれを行うことは可能ですか? クォータニオンに変換して使用する必要がありますか?

この質問は、私が求めているものに最も近いものですが、混乱を招くほど異なっています。

4

1 に答える 1

1

完全な答えではありませんが、コメントするには長すぎます:

2 つの正直な回転行列がある場合、それらは可逆で、行列式 1 である必要があります。行列Aを および と呼びBます。指定された軸を中心に回転することで からに移動できるという意味で、2 つの回転の下にある同じオブジェクトA(X)のイメージとが「近い」ことを確認したい場合、これは、の逆は、その軸を中心とした「ほぼ」回転です。したがって、これはおそらくあなたが見たい種類のものです。B(X) XA(X)B(X)AB

私は OpenGL 行列の数学関数にあまり詳しくないので、コードを提供できません。申し訳ありません。

于 2014-01-03T22:50:46.650 に答える