1. ホーム
  2. opengl

[解決済み] OpenGLでglLoadIdentity()は何をするのですか?

2022-05-16 05:36:15

質問

私はOpenGLの初心者で、私のコードにあるすべてのランダムな関数に少し圧倒されています。それらは動作し、いつそれらを使用するかわかっていますが、なぜそれらが必要なのか、またはそれらが実際に何をするのかがわかりません。

私が知っているのは glLoadIdentity() は現在の行列を単位行列に置き換えますが、これは正確に何をするのでしょうか?もしすべてのプログラムがそれを必要とするならば、なぜ特に指定されない限りはデフォルトで恒等行列ではないのでしょうか?私は自分のコードに、それが何をするものなのかわからないような関数を入れるのは好きではありません。私はリッチな2Dクライアント用にOpenGLを独占的に使用しているので、これが3Dにとって非常に明白なことであるなら、私の無知を許してほしいです。

についても少し混乱しています。 glMatrixMode(GL_PROJECTION) VS glMatrixMode(GL_MODELVIEW) .

どのように解決するのですか?

投影行列とモデルビュー行列に関して、単位行列は基本的にデフォルトの状態にリセットされます。

うまくいけばご存知のように glTranslateglRotate は常にマトリックスの現在の状態に対して相対的です。ですから、例えば glTranslate を呼び出すと、原点からではなく、行列の現在の「位置」から平行移動することになります。しかし、もし原点からやり直したいのであれば、その時は glLoadIdentity() を呼び出すことになり、その後 glTranslate を、原点に位置するようになった行列から、あるいは glRotate は、デフォルトの方向に配置された行列から生成されます。

1と同等というBoonさんの回答は、正確には正しくないのだと思います。実際には行列はこのようになります。

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

これは恒等式行列です。Boonは数学的に正しく、その行列(またはそのように見える行列、対角の1、それ以外はすべて0)と掛け合わされた行列は元の行列になりますが、なぜこれが重要なのかを彼が説明したとは思えません。

なぜこれが重要かというと、OpenGLはすべての位置と回転を各行列に乗算するからです。したがって、たとえば多角形を描くとき、( glBegin(GL_FACE) を描くと、いくつかの点が glEnd() を乗算して世界空間に変換し、さらにPROJECT行列を乗算して3Dから2Dに変換し、画面上の2D点と(画面の「カメラ」からの)深度が得られ、それを使ってピクセルを描画します。しかし、これらの行列の1つが恒等行列である場合、ポイントは恒等行列と乗算されるため、行列は何の効果も持ちません。

これで少しは分かりやすくなったでしょうか!