OpenGL でシーンを動かそうとしていますが、うまくいきません。私はいくつかのチュートリアルを調べて、OpenGL マトリックスの背後にある数学的概念を知っています。私はこれに問題があります。私が必要とするのは、1つの例のようなものです。キーを押したときに「カメラ」が一方向に動く例を見ることができれば、自分の目的に合わせてコードを変更できます。
2 に答える
ええと、OpenGLには実際には「カメラ」がありません。変換パイプライン(固定機能またはプログラム可能)があります。また、OpenGLは「シーン」を維持せず、ポイント、ライン、三角形を一度に1つずつフレームバッファに描画します。
事実に頭を悩ませたら、他の描画API(goTo(x,y); lineTo(x,y);
または同様のもの)を使用するのと本質的にそれほど違いはないということは、OpenGLの多くのことがはるかに理にかなっています。
したがって、OpenGLの「カメラ」は、頂点変換パイプラインのある時点で適用される表示変換にすぎません。通常、モデルビューマトリックスの最後の変換として、モデル変換の後にビュー変換が続きます。したがって、モデルビューです。
ビュー変換を指定する方法はたくさんありますが、これによく使用される一般的なヘルパー関数はgluLookAt
です。変換は逆の順序で適用されるため、マトリックスに乗算されます(OpenGLのglMultMatrixまたは組み込みのマトリックス操作関数の1つが使用されている場合)。モデルビューマトリックスを定義するときに、ビュー変換が最初に行われます。したがって、描画関数では、コードは通常次のようになります。
glMatrixMode(GL_MODELVIEW)
glLoadMatrix(view.transformation) # same as glLoadIdentity(); glMultMatrix(view.transformation)
foreach(object o in objects):
glMatrixMode(GL_MODELVIEW)
glPushMatrix()
glMultMatrix(o.transformation)
o.draw()
glMatrixMode(GL_MODELVIEW)
glPopMatrix()
各マトリックス操作の前に、常に正しいマトリックスモードになっていることを確認していることに気づきましたか?これは、object :: drawが別のマトリックスモード(GL_TEXTUREなど)に切り替わる可能性があり、マトリックスモードの切り替えにはごくわずかなコストしかかからないため、一連のマトリックス操作の前に必ず行う必要があります。
さらなるヒントとして:ビューポートと投影行列を設定するためのコードは、常に描画コードの先頭に配置する必要があります。ウィンドウのサイズ変更イベントハンドラーに配置しないでください。
gluLookAt
カメラを「移動」するために使用できます。
gluLookAt(eyex,eyey,eyez, centerx,centery,centerz, upx,upy,upz);
最初の3つの座標は、仮想の目の座標です。次の3つは、あなたの目が「見ている」座標です。最後の3つは、シーンの上方向を指すベクトルです(目を回転させると考えてください)。
例えば、
gluLookAt(1,1,1, 0,0,0, 0,1,0);
これにより、(1,1,1)に注目し、原点を見ていることになります。上向きベクトルの方向は正のy軸です。
カメラを移動したい場合はgluLookAt
、keypressコールバック関数からキーが押されるたびに更新されたパラメーターを使用して呼び出すことができます。