3

後でゲーム開発で使用できるようになることを願って、単純なマトリックス ライブラリを C++ で作成しようとしています。

基本的な実装は完了しましたが、オブジェクトごとに 1 つの行列しか格納できないという問題に気付きました。回転順序がすぐに混乱してしまいます。

私の知る限り、AB != BA

したがって、マトリックスに任意の回転を継続的に乗算している場合、回転が混乱してしまいますよね? 私の場合、Y 軸でグローバルに回転し、X 軸でローカルに回転する必要があります (Z 軸でローカルに回転するのもいいでしょう)。これらは、平均的な一人称シューティング ゲームの資質のようです。したがって、「混同」とは、Y 軸 (または Z 軸) で回転しようとすると、意図した軸ではな​​く、ローカル X 軸を中心に回転し始めることを意味します (意味がある場合)。

だから、これらは私が思いついた解決策です:

  1. 3 つのオイラー角を保持し、1 つの角が変化したときに行列を正しい順序で再構築する
  2. 各軸に 1 つずつ、3 つの行列を保持する
  3. 乗算中に何らかの方法で行列を破壊し、後で適切に再構築します (?)

それとも私は何も心配していませんか?私の良心の呵責は間違っているのでしょうか? 秩序は魔法のように自然に解決するのでしょうか?

4

2 に答える 2

4

ここで回転行列の順序が問題になる可能性があることは正しいです。

特にオイラー角を使用する場合、ジンバ​​ル ロックの問題が発生する可能性があります。たとえば、最初の回転が +90° の正の「ピッチ」であるとします。これは、まっすぐ上を見ていることを意味します。次の回転が +45° の「ロール」である場合、あなたはまだまっすぐ上を見ているだけです。しかし、逆の順序でローテーションを行うと、まったく別の場所に見えることになります。(これをより明確にする図については、ウィキペディアのリンクを参照してください。)

ゲーム開発における一般的な答えの 1 つは、(1) で得られたものです。オイラー角を個別に格納し、ワールド空間でのオブジェクトの向きを取得するたびに、3 つすべてから回転行列を一度に構築します。

もう 1 つの一般的な解決策は、回転をオイラー角ではなく、単一の軸の周りの角度として保存することです。(これは、アニメーターやプレーヤーのモーションにとって不便なことがよくあります。)

また、回転をより効率的に保存および結合する方法として、クォータニオンをよく使用します。

上記の各リンクから、関連する数学を説明する記事に移動できます。また、Eric Lengyel のMathematics for 3D Game Programming and Computer Graphicsという本も気に入っています。この本では、この主題全体が非常によく説明されています。

于 2012-05-29T05:52:13.493 に答える
2

他の人が通常これをどのように行っているかはわかりませんが、通常は角度を保存し、必要に応じて行列を再構築します。

1 つの行列があり、その上に何かを乗算し続けると、結果がめちゃくちゃになるというのはあなたの言うとおりです。しかし、繰り返しになりますが、これはおそらくあなたがたどりたいルートではないと思います。

どのような種類のグラフィックス システムを使用したいかはわかりませんが、OpenGL を使用すると、マトリックス表現について心配する必要さえありません (非常にパフォーマンスが重要な何かを実行している場合を除きます)。 glRotate などの呼び出し。

于 2012-05-29T05:47:12.637 に答える