0

私はゲーム エンジンに取り組んできましたが、最近、ビュー マトリックスを管理するための Camera クラスを簡単に作成できるようになりました (または別のエンジンに簡単に切り替えることができます)。私はそれが何をしなければならないかを概念的に知っていますが、私が問題を抱えているのは、ローカル原点を中心に回転する方法を理解することです(ビューマトリックスの場合、回転マトリックスに乗算される変換マトリックスと同じになります)。

ダイレクトモードでは、

glTranslatef(x, y, z);   //move back to origin
glRotatef(angle, x_rot, y_rot, z_rot);   //turn using a quaternion
glTranslatef(-x, -y, -z);   //move back to original location

しかし、それがより現代的なアプリケーションにどのように変換されるかはわかりません。基本的に同じことを行い、平行移動行列を原点に戻し、回転させ、逆方向に移動しますか? 回転させたいオブジェクトごとに?これまでにテストしたことから、その方法は表示には機能しますが、3D 空間でそれを制御するのは扱いにくいです (回転を常に調整する方法がわかりません。動きのコンポーネントを単一の vec4 に変換し、回転を乗算し、平行移動に適用してから、実際の回転を行いますか?)

私が見逃している4x4行列の乗算を3つ以上行うよりも効率的な方法があるようです。

提案された解決策を試した後の特定のセクションは次のとおりです。

4

2 に答える 2

3

実行時に完全な行列乗算を行わなくても、投稿したシーケンスと基本的に同じことができます。変換行列は非常に単純であるため、手動で乗算することができます。R3x3 回転マトリックスであり、p回転させたい位置であるため、次の方法で 4x4 マトリックスを構築できます。

  1. R4x4 行列の回転部分に格納します。
  2. を計算p - R * pし、結果を 4x4 マトリックスの変換部分に格納します。

これにより、1 つの行列 * ベクトルの乗算とベクトルの減算に削減されます。紙の上で導き出したばかりなので、私の数学を再確認したいかもしれません.

もう 1 つのアプローチは、CPU コードで回転と平行移動を別々に保持し、必要に応じて更新し、ユニフォームを更新するときにのみそれらを 4x4 マトリックスに結合することです。

シェーダー コードを制御できるため、変換全体を含めるために 4x4 マトリックスを使用する必要さえありません。たとえば、回転の前に平行移動を適用する方が便利な場合は、mat3 回転行列と vec3 平行移動ベクトルをシェーダーに入力し、回転行列を乗算する前に位置に平行移動ベクトルを追加できます。2 つを別々にしておくと、一方を他方よりも頻繁に更新する場合にも役立ちます。

于 2014-04-27T04:49:15.087 に答える
0

古いパイプラインのことを考えて、複雑にしすぎていると思います。

新しい変換行列 T を作成します。既存のカメラ行列 C があるとします。変更されたカメラ行列である C' が必要です。

実際には 2 つのオプションしかありません。また:

C' = CT, or
C' = TC

他にどんな情報があるから?

実際に選択しているのは、既存のカメラ マトリックスの「前」に有効になる新しい変換です。この場合はワールド座標で作用し、「後」にカメラ座標で作用します。

事前乗算が必要なようです。だからそれを使ってください。その後、変換はグローバル座標空間で有効になります。

古い OpenGL ルーチンは常に乗算されます。

于 2014-04-27T04:59:17.863 に答える