1

任意の4x4変換行列が与えられた場合、回転の中心を見つけるにはどうすればよいですか?

m = [m11 m12 m13 m14; 
     m21 m22 m23 m24;
     m31 m32 m33 m34; 
     m41 m42 m43 m44]
4

2 に答える 2

2

これが純粋に回転行列であり、異なるタイプの複数の変換の集約ではないことがわかっている場合は、次の方程式を解くことmで回転軸(ベクトル)を見つけることができます。v

mv = v

これは、ベクトルをそれ自体の周りで回転させてもベクトルが変更されないために機能します。(この方程式には複数の解がありますが、それらはすべてスカラー係数のみが異なることに注意してください。)

残念ながら、それが他の変換を含まないかどうか確信が持てないm場合、回転軸を見つけることができるかどうか、または見つけられるべき固有の回転軸があるかどうかはわかりません。

于 2012-03-29T19:07:59.610 に答える
0

任意の4x4変換行列が与えられた場合、回転の中心を見つけるにはどうすればよいですか?

行列が回転を表していない可能性があるため、一般的なケースでは問題を解決できません。それは、射影行列、零行列などである可能性があります。

それとは別に、あなたはこの答えをチェックしたいかもしれません。

行列は、古い座標系を新しい座標系に変換する変換を表します。


オブジェクトマトリックスは次のように表すことができます。

objx.x     objx.y     objx.z    0 //m[0][0]..m[0][3] or _11, _12, _13, _14
objy.x     objy.y     objy.z    0 //m[1][0]..m[1][3] or _21, _22, _23, _24
objz.x     objz.y     objz.z    0 //m[2][0]..m[2][3] or _31, _32, _33, _34
objpos.x   objpos.y   objpos.z  1 //m[3][0]..m[3][3] or _41, _42, _43, _44

ここで、m[][]と_11.._44は、D3DMATRIX、objpos-オブジェクト位置ベクトル、objx-オブジェクトx(ワールドスペースに変換された「ローカルx」)ベクトルなどの対応する要素です。

最後の列(m [0..3] [3])が0、0、0、1である限り、オブジェクトの位置とその「x」、「y」、「z」ベクトル(「side」)を抽出できます。 、"up"、 "front"-これはアプリケーションによって異なります)マトリックスから。最後の列が「0、0、0、1」でない場合、それは射影行列であり、これからオブジェクトデータを簡単に抽出することはできません。


したがって、新しい座標系内の古い座標系の個々のベクトルと中心、および個々のベクトルを抽出できます。回転の中心や、それらを使用して必要なものを見つけることができます。

ただし、行列が回転を表すには、次の条件が満たされている必要があります。

  1. dotProduct(objx、objy)== 0
  2. dotProduct(objx、objz)== 0
  3. dotProduct(objx、objz)== 0
  4. dotProduct(objx、objx)== 1
  5. dotProduct(objy、objy)== 1
  6. dotProduct(objz、objz)== 1
  7. 最後の列は[0、0、0、1]です

また、個々の軸は適切に方向付けられている必要があります(これが「ミラー」マトリックスではないことを確認できます)。正確な向きは、アプリケーションによって異なります。このようなものである可能性があります:

  1. crossProduct(objy、objx)== objz
  2. crossProduct(objx、objz)== objy
  3. crossProduct(objz、objy)== objx
于 2012-03-29T19:25:26.403 に答える