OpenGLでキューブを作成する方法

著者: Gregory Harris
作成日: 12 4月 2021
更新日: 1 J 2024
Anonim
OpenGLチュートリアル51:キューブマップの反射
ビデオ: OpenGLチュートリアル51:キューブマップの反射

コンテンツ

OpenGLは、単純な形状から複雑な3D画像を作成できる3Dプログラミングツールです。この記事では、彼の助けを借りて、3次元で回転できる単純な立方体を描く方法を学びます!

ステップ

パート1/3:初期インストール

  1. 1 OpenGLをインストールします。 コンピュータにOpenGLをインストールする方法に関するチュートリアルから始めます。すでにOpenGLとCコンパイラを使用している場合は、この手順をスキップして次の手順に進むことができます。
  2. 2 ドキュメントを作成します。 お気に入りのコードエディターで新しいファイルを作成し、mycube.cとして保存します
  3. 3 #includesを追加します。 必要な基本的な#includeディレクティブは次のとおりです。オペレーティングシステムごとにディレクティブが異なることを覚えておくことが重要です。したがって、プログラムがユニバーサルであり、どのシステムでも実行できるように、すべてを選択する必要があります。

      //インクルード#includestdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else #include GL / glut.h> #endif

  4. 4 機能的なプロトタイプとグローバルを追加します。 次のステップは、機能的なプロトタイプを宣言することです。

      //機能プロトタイプvoiddisplay(); void specialKeys(); //グローバル変数doublerotate_y = 0; doublerotate_x = 0;

  5. 5 main()関数を定義します。

      int main(int argc、char * argv [])// GLUTを初期化し、カスタムパラメータを処理しますglutInit(&argc、argv); //ダブルバッファリング、Zバッファリング、トゥルーカラーをサポートするウィンドウをリクエストするglutInitDisplayMode(GLUT_DOUBLE

パート2/3:ディスプレイ()機能

  1. 1 display()機能の目的を理解します。 立方体のレンダリングに関するすべての作業は、この関数の壊れやすい線に当てはまります。一般的な考え方は次のとおりです。立方体の6つの別々の面を描画し、それぞれの位置に配置します。
    • 面ごとに4つのコーナーを定義し、OpenGLがそれらを線で接続し、選択した色で塗りつぶします。これを行う方法を以下に説明します。
  2. 2 glClear()関数を追加します。 まず、この関数を使用する場合、次のことが必要です。 クリアカラーとZバッファ..。これがないと、古い画像が新しい画像の下に表示され、プログラムによって描画されたオブジェクトが正しく配置されません。

      void display()//画面とZバッファをクリアするglClear(GL_COLOR_BUFFER_BIT

    • 最後の2行に注意してください。これらは機能です glFlush();glutSwapBuffers();、上記で説明したダブルバッファリングの効果を提供します。

パート3/3:プログラムの双方向性

  1. 1 specialKeys()関数を追加します。 原則として、すべての準備がほぼ整っていますが、立方体は描画されるだけで回転はされません。これを行うには、作成する必要があります specialKeys()関数、矢印キーを押すことで立方体を回転させることができます!
    • グローバル変数rotate_xとrotate_yが宣言されたのは、この関数のためです。左右の矢印キーを押すと、rotate_yの値が5度増減します。 rotate_xの値も同じように変化しますが、今回は上下の矢印キーを押します。
    • void specialKeys(int key、int x、int y){//右矢印-回転を5度増やしますif(key == GLUT_KEY_RIGHT)rotate_y + = 5; //左矢印-回転を5度減らすelseif(key == GLUT_KEY_LEFT)rotate_y- = 5; else if(key == GLUT_KEY_UP)rotate_x + = 5; else if(key == GLUT_KEY_DOWN)rotate_x- = 5; //画面の更新をリクエストするglutPostRedisplay(); }

  2. 2 glRotate()を追加します。 最後に、オブジェクトを回転できるようにする線を追加します。機能に戻る 画面 () FRONT側の説明の前に以下を追加します。

      //変換をリセットしますglLoadIdentity(); //ユーザーが値を変更したときに回転するrotate_xおよびrotate_yglRotatef(rotate_x、1.0、0.0、0.0); glRotatef(rotate_y、0.0、1.0、0.0); //マルチカラーサイド-FRONT...。

    • 構文に注意してください glRotatef()これはglColor3f()およびglVertex3f()の構文に似ていますが、常に4つのパラメーターが必要です。 1つ目は、度単位の回転角です。次の3つは、x、y、zの順序で回転が行われる軸です。今のところ、xとyの2つの軸に沿って立方体を回転させる必要があります。
    • プログラムで定義するすべての変換には、同様の行が必要です。基本的に、x軸に沿ったオブジェクトの回転をrotate_xの値の変化として表し、y軸に沿った回転をrotate_yの値の変化として表します。ただし、OpenGLはすべてを1つの変換行列にバンドルします。 displayを呼び出すたびに、変換行列を作成し、 glLoadIdentity() 毎回新しいマトリックスから始めることができます。
    • 使用した可能性のある他の変換関数は、glTranslatef()とglScalef()です。これらはglRotatef()に似ていますが、オブジェクトのサイズ変更とスケーリングに必要なパラメーターはx、y、zの3つだけである点が異なります。
    • 3つの変換すべてが1つのオブジェクトに適用されたときにすべてが正しく表示されるようにするには、適切な順序で変換を設定する必要があります。 glTranslate、glRotate、glScale -そしてそれ以外のことは決してありません。 OpenGLは、プログラムを下から上に読み取ることによってオブジェクトを変換します。これをよりよく理解するために、OpenGLが示されている順序(上から下)で変換を適用した場合に1x1x1キューブがすべての変換をどのように処理するかを想像し、OpenGLが下から上に説明を読んでキューブを処理する方法を考えてください。
  3. 3 次のコマンドを追加して、立方体をx方向とy方向に2回スケーリングし、立方体をy軸で180度回転させ、立方体をx軸で0.1移動します。 以前に指定されたglRotate()コマンドを含む、関連するすべてのコマンドが正しい順序になっていることを確認してください。間違いを恐れている場合は、記事の最後にあるプログラムの最終バージョンを参照してください。

      //その他の変換glTranslatef(0.1、0.0、0.0); glRotatef(180、0.0、1.0、0.0); glScalef(2.0、2.0、0.0);

  4. 4 コードをコンパイルして実行します。 コンパイラとしてgccを使用しているとしましょう。そのため、ターミナルに次のコマンドを入力します。

      Linuxの場合:gcc cube.c -o cube -lglut -lGL ./ mycube Macの場合:gcc -o foo foo.c -framework GLUT -framework OpenGL ./ mycube Windowsの場合:gcc -Wall -ofoo foo.c -lglut32cu- lglu32 -lopengl32 ./ mycube

  5. 5 最終的なコードを確認してください。 これは、コメントを翻訳しない、記事の作成者によって作成された最終的なコードです。

      // //ファイル:mycube.c //作成者:Matt Daisley //作成日:2012年4月25日//プロジェクト:OpenGLでキューブを作成するためのソースコード//説明:OpenGLウィンドウを作成して3Dキューブを描画します/ /ユーザーが矢印キーを使用して回転できること////コントロール:左矢印-左に回転//右矢印-右に回転//上矢印-上に回転//下矢印-下に回転// ------ -------------------------------------------------- -//含む// -------------------------------------------- -------------- #include stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h>#else#include GL / glut.h> #endif // ---------------------------------------- ------------------ //関数プロトタイプ// -------------------------- -------------------------------- void display(); void specialKeys(); // ------------------------------------------------ ---------- //グローバル変数// ---------------------------------- ------------------------ doublerotate_y = 0; doublerotate_x = 0; // ------------------------------------------------ ---------- // display()Callback function // ------------------------------- --------------------------- void display()//画面とZバッファをクリアしますglClear(GL_COLOR_BUFFER_BIT // ------ -------------------------------------------------- -// specialKeys()コールバック関数// ------------------------------------------- ------------------ void specialKeys(int key、int x、int y){//右矢印-回転を5度増やしますif(key == GLUT_KEY_RIGHT)rotate_y + = 5; //左矢印-回転を5度減らすelseif(key == GLUT_KEY_LEFT)rotate_y- = 5; else if(key == GLUT_KEY_UP)rotate_x + = 5; else if(key == GLUT_KEY_DOWN)rotate_x- = 5; //表示の更新を要求するglutPostRedisplay();} // ------------------------------------ ---------------------- // main()関数// -------------------- -------------------------------------- int main(int argc、char * argv [] )GLUT_RGB