2012-01-01 8 views
2

XNAで単純なARプログラムを作成しましたが、私は現在2つのマーカー間の相対的な変換を探しています。2つの位置の間の相対的な変換を見つけようとしています - XNA

私は自分のカメラに関連してマーカーを配置し、マーカーの翻訳と回転行列を抽出しました。

私がしようとしているのは、マーカー1からマーカー2に到達する相対的な翻訳を見つけることです。たとえば、マーカー1とマーカー2が同じZ平面上にある場合、Z並び成分は0mmになります。

以下のアプリケーションが同一平面上に2つの位置のために働いている画像:私は単に第1マーカーの逆数により第2マーカーの行列を乗算してIを得ることができると仮定

enter image description here

翻訳。しかし、私は完全に間違った結果を得ています。

次のように私が実行しているコードは:

posit.EstimatePose(点、マトリックスアウト、トランスアウト)。

  float yaw, pitch, roll; 

      matrix.ExtractYawPitchRoll(out yaw, out pitch, out roll); 

      Matrix rotation = 
       Matrix.CreateFromYawPitchRoll(-yaw, -pitch, roll); 

      Matrix translation = 
       Matrix.CreateTranslation(new Vector3(trans.X, trans.Y, -trans.Z)); 

      Matrix complete = rotation * translation; 
      List<Matrix> all = new List<Matrix>(); 
      all.Add(rotation); 
      all.Add(translation); 
      all.Add(complete); 
      matrixes.Add(all); 

     } 

     Matrix res = Matrix.Invert(matrixes[0][2]) * matrixes[1][2]; 
     Vector3 scaleR; 
     Vector3 translationR; 
     Quaternion rotationR; 
     res.Decompose(out scaleR, out rotationR, out translationR); 

結果:

TranslationR:{X:-103.4285 Y:-104.1754 Z:104.9243} XNAを使用して上記のように、私が想定よう

Iは、3Dを重ねた画像上軸カメラとの相対的な回転と平行移動が正しく行われました。

私は翻訳を計算する途中で何か間違っているようです。私は間違いなくZが104mmになるとは思わないでしょう。

{X:0、Y:150 Z:0}

答えて

0

私は(しかし、それは、2D環境で3x3の行列を使用し、前にこれと同様のものをやったIは、線に沿って何かを期待していましたX、Y移動、回転、スキュー)。問題の行列は4x4ですか?

はい、行列M1を持つオブジェクトAを行列M2でオブジェクトBに変換する行列を見つけるには、M1 '* M2(M1'は逆行列)を計算できます。

Matrixが回転、平行移動、スケール、その他の変形(スキュー/パースペクティブなど)で構成されているという問題があります。行列をその構成部分に分解することは、しばしば非決定的な解をもたらす。その二次方程式のように、複数のソリューションがあります。

Matrix操作は可換ではなく、間違った方法で実行している可能性があります。 M1 '* M2とM2 * M1'を実行すると、異なる結果が得られます。

試してみてください(マトリックスの順序を入れ替えてください)。また、私はあなたが使用した行列分解関数を探していたでしょう - 回転のどの値&スケーリングは出力に得ていますか?あなたのオブジェクトは回転しているの?そうでなければゼロになるはずです。同じ最終結果を得るために複数の回転+平行移動の解を持つことは可能であり、分解関数はそれがあなたが探しているものを知らないことに注意してください。ただ翻訳成分を抽出する


、あなたはメソッドを使用することができますthis pageを形成:

vt = (M14, M24, M34)T 

あなたがそれをしようとすると、あなたは何を得るのですか?

0

私は何をしようとしています1.

Vector3 relativeTranslation = Marker2Matrix.Translation - marker1Matrix.Translation; 

は、私の答えはので、多分、私は把握していないよ過度に単純化したと思われるマーカーから2をマーカーに を取得するために、相対的な翻訳を見つけることですあなたの質問は完全ですが、Marker1の場所(翻訳)に追加するとMarker 2の場所に移動するベクターが作成されます。

関連する問題