前のセクションでは、三角形と四角形に色を付ける方法を説明しました。このレッスンでは、これらの色付きオブジェクトを座標軸を中心に回転する方法を説明します。
実際には、前のセクションのコードに数行を追加するだけです。ルーチン全体をもう一度書き直してみましょう。何が追加され、何が変更されたのかを知るのに便利です。
2 つの変数を追加して、これら 2 つのオブジェクトの回転を制御します。これら 2 つの変数は、プログラムの先頭で他の変数の後に追加されます (bool fullscreen=TRUE; 2 行下)。これらは浮動小数点型の変数であり、オブジェクトを非常に正確に回転させることができます。浮動小数点数には小数点以下の桁が含まれるため、1、2、3... の角度を使用する必要はありません。浮動小数点数が OpenGL プログラミングの基礎であることがわかります。 rtri という新しい変数は三角形の回転に使用され、rquad は四角形の回転に使用されます。
ヴァール
…
rtri : GLfloat // 三角形の角度 (新規)
rquad : GLfloat; // 四角形の角度 (新規)
…
次に、glDraw() を次のように変更します。
手順 glDraw();
始める
glClear(GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT); // 画面と深度バッファをクリアします。
glLoadIdentity(); //現在のモデル観測行列をリセットします。
// 次のコード行は新しい行です。 glRotatef(Angle,Xvector,Yvector,Zvector) は、特定の軸を中心にオブジェクトを回転します。
//このコマンドには多くの用途があります。角度は通常、オブジェクトが回転する角度を表す変数です。
//3 つのパラメータ Xvector、Yvector、Zvector が共同して回転軸の方向を決定します。
//たとえば、(1,0,0) で記述されるベクトルは、X 座標軸の 1 単位を通過し、右方向に向きます。
//(-1,0,0) で記述されるベクトルは、X 座標軸の 1 単位を通過しますが、左方向に通過します。
//D. Michael Traub: Xvector、Yvector、Zvector について上記の説明を提供します。
//X、Y、Z の回転をよりよく理解するために、いくつかの例を示します...
//X 軸 - テーブルソーを使用しています。鋸刃の中心の軸は、左から右に配置されます (OpenGL の X 軸と同様)。
//鋭い鋸歯が X 軸を中心に激しく回転し、上向きまたは下向きに回転しているように見えます。
//鋸刃が回転し始める方向に依存します。これは、OpenGL で X 軸を中心に何かを回転させるときと同じ状況です。
//(翻訳者注: この瞬間にモニターに顔を向けると、確実に切り裂かれますよ^-^。)
//Y 軸 - あなたが巨大な竜巻の中心にいて、竜巻の中心が地面から空を向いているとします (OpenGL の Y 軸と同じです)。
//ゴミや破片は、Y 軸の周りを左から右、または右から左に激しく回転します。
//これは、OpenGL で Y 軸を中心に何かを回転するときと同じ状況です。
//Z 軸 - ファンを真正面から見ています。ファンの中心は正確に自分の方向を向いています (OpenGL の Z 軸のように)。
//ファンブレードは Z 軸を中心に時計回りまたは反時計回りに激しく回転します。これは、OpenGL で Z 軸を中心に何かを回転させるときと同じ状況です。
glTranslatef(-1.5, 0.0, -6.0); // 左に 1.5 単位移動し、画面 6.0 に移動します。
//次のコード行では、rtri が 7 に等しい場合、三角形を Y 軸を中心に左から右に 7 回転させます。
//パラメータの値を変更して、X 軸と Y 軸を中心に三角形を同時に回転させることもできます。
glRotatef(rtri, 0.0, 1.0, 0.0); // Y 軸を中心に三角形を回転します (new)
//以下のコードには変更はありません。色付きのグラデーション三角形が画面の左側に描画され、Y 軸を中心に左から右に回転します。
glBegin(GL_TRIANGLES); // 三角形を描画します
glColor3f(1.0, 0.0, 0.0); //現在の色を赤に設定します。
glVertex3f(0.0, 1.0, 0.0); // 上部の頂点
glColor3f(0.0, 1.0, 0.0); //現在の色を緑に設定します。
glVertex3f(-1.0, -1.0, 0.0); // 左下
glColor3f(0.0, 0.0, 1.0); //現在の色を青に設定します。
glVertex3f(1.0, -1.0, 0.0); // 右下
glEnd(); // 三角形の描画の終了
//以下のコードでは、別の glLoadIdentity() 呼び出しが追加されていることがわかります。
//目的はモデル観測行列をリセットすることです。
//リセットせずに glTranslate を直接呼び出すと、予期しない結果が発生します。
//座標軸が回転しているため、希望の方向ではない可能性があります。
//つまり、座標軸をどれだけ回転させるかによっては、当初オブジェクトを左右に移動させたかったものが上下になる可能性があります。
// glLoadIdentity() をコメントアウトした後に何が起こるかを試してください。
//モデル観測行列をリセットした後、X、Y、Z 軸がすべてリセットされ、glTranslate を呼び出します。
//今回は、前回のレッスンのように 3.0 単位ではなく、1.5 単位だけ右に移動したことに気づくでしょう。
//シーンをリセットすると、フォーカスがシーンの中心 (0.0) に戻ったためです。
//この方法では、右に 1.5 単位だけ移動する必要があります。
//新しい位置に移動したら、X 軸を中心にクワッドを回転します。四角形が上下に回転します。
glLoadIdentity(); //モデル観測行列をリセット
glTranslatef(1.5, 0.0, -6.0); // 1.5 単位右に移動し、画面 6.0 に移動します。
glRotatef(rquad, 1.0, 0.0, 0.0); // X 軸を中心に四角形を回転します (new)
glBegin(GL_QUADS); // 正方形を描画します
glColor3f(0.6, 0.2, 2.0); //現在の色を紫に設定します。
glVertex3f(-1.0, 1.0, 0.0); // 左上
glVertex3f(1.0, 1.0, 0.0); // 右上
glVertex3f(1.0, -1.0, 0.0); // 左下
glVertex3f(-1.0, -1.0, 0.0); // 右下
glEnd(); // 正方形の描画の終了
// 次の 2 行は新しい行です。
//rtri と rquad をコンテナとして想像すると、
//次に、プログラムの開始時にコンテナー (rtri および rquad) を作成しました。
// コンテナが作成されたとき、コンテナは空です。
//以下のコードの最初の行は、コンテナに 0.2 を追加します。
//したがって、前のコードを実行するたびに、rtri コンテナーの値はここで 0.2 ずつ増加します。
//次の行は、rquad コンテナ内の値を 0.15 減らします。
//同様に、前のコードを実行するたびに、rquad コンテナーの値はここで 0.15 ずつ減少します。
//落下すると、最終的にオブジェクトは成長方向とは逆の方向に回転します。
rtri := rtri + 0.2; // 三角形の回転変数を増加します (新規)
rquad := rquad - 0.15; // 四角形の回転変数を減らす (new)
終わり;