2

ダイレクトモードのOpenGLプログラムからVRMLにシーンをエクスポートしようとしています。

OpenGLとVRMLの両方で、面は、シーンの原点を基準にした独自の平行移動、回転、およびスケールを使用してオブジェクトにグループ化できます。

OpenGLでは、これらは1つのマトリックスで平行移動と回転/スケールを表す4つのマトリックスとして保存されます[1]。VRMLでは、これらは個別の平行移動、回転、スケーリングのベクトルとして表現する必要があります[2] [3]

この方法で任意の4行列を分解するにはどうすればよいですか?

これを行うには、ライブラリ関数を使用して、維持する必要のあるコードを最小限に抑え、エラーの可能性を減らすことをお勧めします。私はWindowsでC#を使用しており、任意のCLRまたはWindowsネイティブDLLにアクセスできます。

4

3 に答える 3

1

Matrix.DecomposeコードをMonogameソースから見てください。

覚えておいてください-OpenGLマトリックスは列優先であり、DirectX/XNAは行優先です。

お役に立てば幸いです。

于 2012-06-07T20:46:13.213 に答える
1

この方法で任意の4行列を分解するにはどうすればよいですか?

変換の右端の列は、並進ベクトルTです。

スケールと回転は、抽出するのが少し複雑です。回転軸と回転角を見つける必要があります。基本的に、ここでは固有ベクトルの問題を扱っています。行列の変換の下で変化しないベクトルを見つけます。これは固有ベクトルの場合です。回転は直交変換です。したがって、回転行列の非正規部分はスケーリングです。このスケーリングは、最初に行列を正規化して、スケーリング係数Sを生成することで抽出できます。最後に、固有ベクトルの問題を解いて、回転軸である2つの逆平行固有ベクトルを見つけることができます。対応する固有値は、回転のcos(α)を指定します。これにより、回転軸と角度Rが得られます。

于 2012-06-07T22:17:10.903 に答える
0

SFMatrix4f/dおよびSFMatrix3/dには、コンポーネント内の行列を分解する関数が組み込まれています。仕様のページは次のとおりです:http ://www.web3d.org/documents/specifications/19777-1/V3.0/Part1/functions.html#t-Matrix4Functions 。

JavaScriptでは、次のように入力できます。

function foo (matrix4f)
{
   var translation = new SFVec3f ();
   var rotation    = new SFRotation ();
   var scale       = new SFVec3f ();

   matrix4f .getTransform (translation, rotation, scale);
}

一部のブラウザは、4番目と5番目のパラメータとしてscaleOrientationとcenter引数をgetTransformとしてサポートしています。

于 2014-10-11T17:01:51.830 に答える