質問
OpenGLで単純な回転を実行しようとしていますが、要点が欠けているはずです。私は特定の修正を求めているわけではなく、OpenGL ローテーションをより一般的に説明する簡単な説明やリンクを探しています。
現時点では次のようなコードがあります。
glPushMatrix();
glRotatef(90.0, 0.0, 1.0, 0.0);
glBegin(GL_TRIANGLES);
glVertex3f( 1.0, 1.0, 0.0 );
glVertex3f( 3.0, 2.0, 0.0 );
glVertex3f( 3.0, 1.0, 0.0 );
glEnd();
glPopMatrix();
しかし、結果は 90 度回転した三角形ではありません。
編集うーん、Mike Haboustak に感謝します。私のコードが glOrtho を使用する SetCamera 関数を呼び出していたようです。私は OpenGL にあまり慣れていないので、これが何を意味するのかまったくわかりませんが、これを無効にして Z 軸で回転すると、望ましい結果が得られました。
解決
1単位の直線が得られますか?90度腐っているようです。Y の周りでは、奥行きのない三角形の側面を見ることになります。
代わりに Z 軸を中心に回転してみて、より意味のある結果が得られるかどうかを確認してください。
OpenGL には、ジオメトリの表示に関連する 2 つのマトリックス、ModelView と Projection があります。どちらも、データが画面に表示される前に座標に適用されます。まず、ModelView マトリックスが適用され、データがモデル空間からビュー空間に変換されます。次に、投影マトリックスが適用され、2D モニタ上で「投影」するためにビュー スペースからのデータが変換されます。
ModelView は複数のオブジェクトを「ワールド」内の位置に配置するために使用され、Projection はオブジェクトを画面上に配置するために使用されます。
あなたのコードは問題ないようですので、ドキュメントを読んで glPushMatrix() のような関数の性質が何であるかを理解していると思います。Z を中心に回転しても意味がわからない場合は、glMatrixMode を呼び出して ModelView 行列を編集していることを確認してください。
他のヒント
glRotatef 呼び出しの前に以下を追加して、モデルビュー行列を変更していることを確認します。
glMatrixMode(GL_MODELVIEW);
それ以外の場合は、代わりに投影またはテクスチャ マトリックスのいずれかを変更している可能性があります。
「受け入れられた答え」は完全に正しいわけではありません。このコードの前に何か奇妙なことをしていなければ、Z の周りを回転してもこの三角形は見えません。この場合、glOrtho(...) 呼び出しを削除すると問題は修正された可能性がありますが、他にもいくつかの問題が残っています。
書かれたコードには 2 つの大きな問題があります。
以前にカメラを設置しましたか?OpenGL では、カメラは原点に配置され、Y を上にして Z 軸を見下ろします。この場合、三角形は目と同じ平面上で右上に描画されます。よほど奇妙な射影行列を持っていない限り、それを見ることはできません。gluLookat() はこれを行う最も簡単なコマンドですが、現在の行列 (MODELVIEW である必要があります) を移動する任意のコマンドを機能させることができます。
OpenGL のデフォルトは右手、つまり反時計回りの座標系であるのに対し、左手、つまり時計回りの方法で三角形を描画しています。これは、バックフェースをカリングしている場合 (おそらくそうではありませんが、上級者になるにつれてカリングに移行する可能性があります)、三角形が期待どおりに表示されないことを意味します。問題を確認するには、右手を顔の前に置き、X-Y 平面上にあることを想像して、頂点 (1,1)、(3,2)、(3,1) を描く順序で指を動かします。 )。これを行うとき、親指は顔の反対側を向きます。つまり、三角形の裏側を見ていることになります。OpenGL では右手で顔を描くのが一般的な方法なので、右手で顔を描く習慣を身につける必要があります。
私がお勧めできる最善の方法は、NeHe チュートリアルを使用することです。 http://nehe.gamedev.net/. 。まず、いくつかのシステムで OpenGL をセットアップする方法を示し、三角形の描画に移り、ゆっくりと確実により高度なトピックに進みます。フォローするのはとても簡単です。
私が OpenGL を初めて見たとき、 NeHe チュートリアル (左側のメニューを参照) は非常に貴重でした。
本をお勧めしたいのですが:
3Dコンピュータグラフィックス:OpenGL の数学的入門 サミュエル R.バス
非常に明確な説明があり、数学はグラフィックス以外の領域にも広く適用できます。また、正投影法と正投影法の詳細な説明も見つかります。視点の変換。
射影行列については、ここから始めるのに適したソースを見つけることができます。
http://msdn.microsoft.com/en-us/library/bb147302(VS.85).aspx
あるタイプの射影行列を構築する方法について少し説明します。正投影は、このようなマトリックスの非常に基本的/原始的な形式であり、基本的には 3 つの軸座標のうち 2 つを取得して、それらをスクリーンに投影します (軸を反転したり拡大縮小したりすることはできますが、ワープや遠近効果はありません)。 。
マトリックスの変換は、3D でレンダリングする場合に最も重要なことの 1 つであり、基本的に 3 つのマトリックス ステージが必要です。
- Transform1 = オブジェクト座標系をワールドに変換 (例: オブジェクトの回転とスケール)
- Transform2 = 世界座標系をカメラに変換 (オブジェクトを適切な場所に配置)
- Transform3 = カメラ座標系からスクリーン空間へ (スクリーンへの投影)
通常、3 つの行列の乗算結果は WorldViewProjection 行列と呼ばれます (この用語に遭遇したことがある方は)。これは座標をモデル空間からワールドを経てカメラ、そして最後に画面表現に変換するためです。
楽しむ