0

私のopenglアプリケーションでは、モデルを記述するためのGameObjectクラスがあり、各モデルにはその平行移動/回転/スケールを記述する1つのマトリックスがあり、平行移動/回転/スケールをしたいときはいつでも、Model_Matrix->translateのようなものを呼び出すだけです(dx, dy, dz) は、モデル マトリックスに直接作用するため、永続的に変化します。最初に知りたいのですが、それは正しい方法ですか?オンラインの多くの記事では、平行移動、回転、スケールの 3 つのマトリックスについて説明されており、これらを乗算して変換マトリックスを作成します。すべての計算に 1 つだけを使用します。

現在のように、この問題の原因について誰かが光を当てることができますか、私は混乱しています

注: 私は行列の数学をいくつか知っていますが、ほんの少しです

4

3 に答える 3

0

行列が 1 つしかないことの欠点の 1 つは、操作が互いに影響し合うことです。つまり、scale(2,2,2) を実行し、translate(2,2,2) よりも、モデルは予想されるように 2 ではなく、すべての軸で4だけ移動します。ローテーションでも同じ問題がありますが、理解するのはさらに悪いです;)

次の問題は、scale() と rotate() が常に原点を使用することです。つまり、回転またはスケーリングしたい場合は、現在の平行移動がどこにあるかを考え、この値で計算する必要があります。これは難しいことです。

スケーリング/平行移動/回転の戦略を見つけるには、オブジェクトの寿命のどの段階で何をしたいのかを考える必要があります。建設とその後の動き。

ただし、既存のものをまとめることで、「より良い」行列演算を実装できます。IE 疑似コード

scale(float[3] s, float[3] originPoint)

として実装されます

translate(-originPoint); scale(s); translate(originPoint);

rotate(float alpha, float[3] p1, float[3] p2)

として実装されます

translate(-p1); rotate(alpha, p2-p1); translate(p1);

また、scale() をまったく使用しないと、作業が楽になります。

乾杯、フランク

于 2013-01-07T18:01:45.210 に答える
0

マトリックス自体が本当に必要な場合は、1 つのマトリックスを維持するだけで問題はありません。ただし、カメラのトランジションなどを行いたい場合は、注意が必要です。

行列 A (前) と行列 B (後) があり、プログラムでカメラ (またはオブジェクト) を A 視点から B 視点に連続的に移動できるようにしたいとします。各位置を決定する行列しかない場合、これは困難です (特に、純粋な行列代数によって一意に決定されるわけではありません)。

ただし、スケーリング、回転、平行移動を別々に維持する場合は、行列をまったく使用せずに、 gluLookAt関数に従ってeyecenterおよびベクトルを維持することでこれを行うのが適している場合があります。up

于 2012-08-16T12:36:27.350 に答える
0

変換を (オブジェクトごとに) マトリックスとして維持することをお勧めします。なぜなら、それらを別々に保持すると、これらの操作が実行される順序に関する暗黙の知識が導入されるからです (したがって、異なる結果が生成される可能性があります)。

変換の暗黙的な順序付けに悩まされるのを防ぐ 1 つの方法は、TranslateTransform、RotateTransform、ScaleTransform を任意の数だけ含めることができる TransformGroup などのクラスを使用することです。それぞれのプロパティを変更して調べることができます。この方法の例を見るには、ここを見てください。

于 2012-07-31T20:43:27.590 に答える