OpenGLでglLoadIdentity()は何をしますか?


132

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

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

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

回答:


139

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

あなたがうまくいけば知っている、としてglTranslateそしてglRotate常に行列の現在の状態を基準にしています。たとえば、を呼び出すとglTranslate、原点からではなく、マトリックスの現在の「位置」から翻訳します。ただし、原点からやり直したい場合は、を呼び出したときに、原点にあるマトリックスから、またはデフォルトの方向に向いたマトリックスから行うglLoadIdentity()ことができます。glTranslateglRotate

1に相当するというBoonの答えは正確ではありません。マトリックスは実際には次のようになります。

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

それが単位行列です。ブーンは数学的に正しいですが、その行列(またはそのような行列、対角行列、その他すべて0)を掛けた行列は元の行列になりますが、これがなぜ重要なのかは彼が説明したとは思いません。

これが重要である理由は、OpenGLが各マトリックスを通じてすべての位置と回転を乗算するためです。したがって、たとえばポリゴン(glBegin(GL_FACE)、いくつかのポイントglEnd())を描画する場合、ポリゴンをMODELVIEWで乗算して「ワールドスペース」に変換し、次に、PROJECTマトリックスで乗算して3Dから2Dに変換します。これにより、画面上の2Dポイントと、ピクセルの描画に使用する(画面の「カメラ」からの)深度 しかし、これらのマトリックスの1つが単位マトリックスである場合、ポイントは単位マトリックスで乗算されるため変更されないため、マトリックスは効果がありません。ポイントを変換せず、回転せず、そのままにしておきます。

これでもう少し明確になることを願っています!


1
つまり、OpenGLは「マスター」または「グローバル」マトリックスを維持し、後続の各マトリックスはその「マスター」または「グローバル」マトリックスに関連して適用されます。私は正しいですか?
user366312 2015年

41

単位行列は、数値の1に相当します。ご存じのとおり、1を掛けた数はそれ自体です(e.g. A x 1 = A)

同じことがマトリックスにも当てはまり( MatrixA x IdentityMatrix = MatrixA)ます。

したがって、恒等行列の読み込みは、行列を行列スタックに乗算する前に、行列を正しい状態に初期化する方法です。

glMatrixMode(GL_PROJECTION) :透視変換または直交変換で使用される行列を扱います。

glMatrixMode(GL_MODELVIEW):モデルビュー変換で使用される行列を扱います。つまり、オブジェクト(別名モデル)をビュー座標空間(またはカメラ空間)に変換します。


6

投影行列は、表示ボリュームを作成するために使用されます。現実世界のシーンを想像してみてください。あなたは本当にあなたの周りのすべてのものを見るのではなく、あなたの目が見ることができるものだけを見ます。たとえば、魚の場合、少し広い範囲で見ます。したがって、射影行列を設定するとは、作成するシーンから見たいものを設定することを意味します。つまり、世界のどこにでもオブジェクトを描くことができます。それらがビューボリューム内にない場合、何も表示されません。ビューボリュームを作成するとき、視野を定義する6つのクリッピングプレーンを作成するとします。

モデルビューマトリックスについては、世界のモデル(オブジェクト)にさまざまな変換を行うために使用されます。このように、オブジェクトを1回定義してから、移動または回転またはスケーリングするだけで済みます。

シーン内のオブジェクトを描画する前に投影行列を使用して、ビューボリュームを設定します。次に、オブジェクトを描画し、それに応じてモデルビューマトリックスを変更します。もちろん、たとえばシーンを描き、テキスト(いくつかのメソッドを使用すると、正投影でより簡単に作業できる)を描き、モデルビューマトリックスに戻す場合は、モデルの描画の途中でマトリックスを変更できます。

名前modelviewに関しては、それはモデリングと表示変換の二重性と関係があります。カメラを5ユニット後ろに引くか、オブジェクトを5ユニット前に動かすと、基本的に同じです。

私はいくつかの光を当てたことを願っています


2

単位行列は、行列を適切なデフォルトに「初期化」するために使用されます。

理解しておくべき重要なことの1つは、行列の乗算はある意味で加算的であることです。たとえば、単位行列で始まる行列を取得し、それを回転行列に掛け、次にスケーリング行列を掛けると、最終的に、それが乗算される行列を回転およびスケーリングする行列になります。


0

他の人が言ったことを要約すると、単位行列は、ベクトル/行列に乗算すると、結果が同じベクトル/行列になるような行列です。これは、乗算を伴う数値1または加算を伴う数値0に相当します。

glLoadIdentity()は非推奨の関数であり、独自の行列を管理することをお勧めします。


-1

glLoadIdentity() 関数は、投影モードに入るたびに、行列が恒等行列にリセットされるようにします。これにより、新しい表示パラメーターが以前の表示パラメーターと組み合わされなくなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.