web-dev-qa-db-ja.com

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

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

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

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

129
Alexander

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

ご存じのとおり、glTranslateglRotateは常にマトリックスの現在の状態に相対的です。したがって、たとえば、glTranslateを呼び出すと、Originではなく、マトリックスの現在の「位置」から変換します。ただし、Originからやり直したい場合は、glLoadIdentity()を呼び出すと、OriginにあるマトリックスからglTranslateまたはglRotateを呼び出すことができます現在はデフォルトの方向に向いているマトリックスから。

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

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

それが単位行列です。ブーンは、数学的には、そのマトリックス(またはそのように見えるマトリックス、対角行列、他のすべて0)で乗算されたマトリックスは、元のマトリックスになりますが、これが重要である理由を説明したとは思いません。

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

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

136
Ricket

単位行列は、数値の1に相当します。ご存知のように、1で乗算する数値自体は_(e.g. A x 1 = A)_であり、

マトリックス_( MatrixA x IdentityMatrix = MatrixA)_についても同じことが言えます。

そのため、単位行列を読み込むことは、行列を行列スタックに追加する前に、行列を正しい状態に初期化する方法です。

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

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

39
Boon

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

Modelviewマトリックスに関しては、ワールド内のモデル(オブジェクト)にさまざまな変換を行うために使用されます。このように、オブジェクトを一度定義するだけで、それを平行移動、回転、または拡大縮小するだけで済みます。

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

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

光を当ててほしい

6
blue

恒等行列は、行列を正しいデフォルトに「初期化」するために使用されます。

実現するべき重要なことの1つは、行列の乗算はある意味で加算的であるということです。たとえば、恒等行列で始まる行列を取得し、それを回転行列に乗算し、次にスケーリング行列を乗算すると、乗算される行列を回転およびスケーリングする行列になります。

2
dicroce