8

現時点では、AR 用のマーカー検出システムがあります。シーン内のマーカーを検出し、シーン内の各マーカーのカメラの変換マトリックスを提供します。

2 つのマーカーを見つけたとします。他のマーカーの向きと一致させるために、マーカーの1つに適用する必要がある回転行列を見つけようとしています。

あるマーカーから別のマーカーへの変換行列を計算し、変換を分解してx、y、zオイラー回転行列を取得するのと同じはずだと考えましたが、これを機能させることができないようです。XNAでC#を使用しています。

コード内:

 Matrix marker1 = markerTransforms[0];
 Matrix marker2 = markerTransforms[1];

 Matrix relativeTransform = Matrix.Invert(marker1) * marker2;

 Quaternion rotation;
 Vector3 scale;
 Vector3 translation;
 relativeTransform.Decompose(out scale, out rotation, out translation);
 Matrix rotationMatrix = Matrix.CreateFromQuaternion(rotation);

上記はうまくいかないようです。

別の質問は、回転行列から x、y、z オイラー回転を抽出する方法ですか?

編集:

ここで x、y、z の順序に従って四元数をオイラーに変換する関数を見つけました: http://forums.create.msdn.com/forums/p/4574/23763.aspx

これを私のコードに適用すると、次の結果が得られました。

ここに画像の説明を入力

実際の回転は次のようになります: x:0 y:0 z:-0.52

また、カメラの位置によって y と z が大きく変化することにも気付きました。

ここで説明されているように、マーカー検出器から取得した 2 つの変換行列には、マーカーの 1 つに対するカメラの方向と移動が含まれてい ますそれらを XNA 形式に変換し、コーナーを画面に描画でき、カメラが見ているものと一致するため、それらが正しく機能することを知っています。

4

1 に答える 1

7

私が最も気に入っている解決策は、クォータニオンを使用することです。q1で記述された 1 つの方向とq2で記述された別の方向がある場合、ある方向から別の方向に移動するには、次のようにします。

q1=q*q2

あなたが探している回転です。

q = q1 * (q2)^-1; q = q1 * conj(q2);

回転から四元数に、四元数から回転に変換するだけです。

同等性が真になるように、必ず四元数を正規化してください。私がリンクしたページには、必要な数式、説明、さらには Java や C++ のコードがすべて含まれています。お気に入りに追加する価値は本当にあります。

于 2012-06-04T10:48:44.130 に答える