0

Opengl ライブラリを使用して C++ で以下のコードを記述しました。画面上に単純な三角形が表示されます (2d)

レンダリング関数のコードを変更して、3D ボックスまたはプリミティブ オブジェクトを作成するにはどうすればよいですか?

コードは以下のとおりです。

#include <iostream>
#include <GLUT/GLUT.h>
#include <OpenGL/OpenGL.h>

void render(void);
int main(int argc, char ** argv)

{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
    glutInitWindowPosition(100,100);
    glutInitWindowSize(800,600);
    glutCreateWindow("Welcome");

    glutDisplayFunc(render);
    glutMainLoop();

    return 0;
}

void render(void)

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBegin(GL_POLYGON);
    glColor3f(0.0,1.0,0.0);
    glVertex2f(-0.5, -0.5);
    glColor3f(1.0,0.0,0.0);
    glVertex2f(0.5,0.0);
    glColor3f(0.0,0.0,1.0);
    glVertex2f(0.0,0.5);


    glEnd();
    glutSwapBuffers();
}
4

2 に答える 2

4

デニスの答えのフォローアップとして...

OpenGL についてもう少し学習したい場合 (立方体を描きたいだけなら難しいかもしれません...)、小規模なデモを行うときに再利用するコードを次に示します。頂点配列とバッファ オブジェクトを使用し、(0, 0, 0) を中心とするテクスチャ付きの四角柱を作成します。独自のテクスチャを提供する必要があります。

直角プリズムを生成するコードは次のとおりです。

void GLmakeRect(GLuint vao, GLuint vbo[2], float w, float h, float d, GLuint storageHint) {
  /*
         8|---|9
         0|BAC|1
    10|---|---|---|12
      |LEF|TOP|RIG|
    11|---|---|---|13
         3|FRO|2
         4|---|5
          |BOT|
         6|---|7
  */
  float verts[] = {
    -0.5*w, 0.5*h, -0.5*d,   1.0/3.0, 0.25,
    0.5*w, 0.5*h, -0.5*d,    2.0/3.0, 0.25,
    0.5*w, 0.5*h, 0.5*d,     2.0/3.0, 0.5,
    -0.5*w, 0.5*h, 0.5*d,    1.0/3.0, 0.5,
    -0.5*w, -0.5*h, 0.5*d,   1.0/3.0, 0.75,
    0.5*w, -0.5*h, 0.5*d,    2.0/3.0, 0.75,
    -0.5*w, -0.5*h, -0.5*d,  1.0/3.0, 1.0,
    0.5*w, -0.5*h, -0.5*d,   2.0/3.0, 1.0,
    -0.5*w, -0.5*h, -0.5*d,  1.0/3.0, 0.0,
    0.5*w, -0.5*h, -0.5*d,   2.0/3.0, 0.0,
    -0.5*w, -0.5*h, -0.5*d,  0.0, 0.25,
    -0.5*w, -0.5*h, 0.5*d,   0.0, 0.5,
    0.5*w, -0.5*h, -0.5*d,   1.0, 0.25,
    0.5*w, -0.5*h, 0.5*d,    1.0, 0.5
  };
  int polys[] = {
    0, 3, 1, 1, 3, 2,    // TOP
    3, 4, 2, 2, 4, 5,    // FRONT
    4, 6, 5, 5, 6, 7,    // BOTTOM
    8, 0, 9, 9, 0, 1,    // BACK
    10, 11, 0, 0, 11, 3, // LEFT
    1, 2, 12, 12, 2, 13  // RIGHT
  };
  glBindVertexArray(vao);
  glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
  glBufferData(GL_ARRAY_BUFFER, sizeof(verts), &verts[0], storageHint);
  glEnableVertexAttribArray(0);
  glEnableVertexAttribArray(1);
  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5*sizeof(float), 0);
  glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(float), (void*)(3*sizeof(float)));
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[1]);
  glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(polys), &polys[0], storageHint);
}

初期化中に次のように関数を呼び出すことができます。

GLuint vao, vbo[2]
glGenVertexArrays(1, &vao);
glGenBuffers(2, &vbo[0]);
GLmakeRect(vao, vbo, 1, 1, 1, GL_STATIC_DRAW);

レンダリング ループで立方体を描画するには、次のようにします。

glBindTexture(GL_TEXTURE_2D, yourTextureHandleHere);
glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);
于 2012-09-30T15:45:20.720 に答える
3

単純な立方体を表示したい場合は、"glutSolidCube" (および、おそらく他の "glutSolidABC" 関数) を参照してください: glutSolidCube

ただし、3D オブジェクトを表示する場合は、射影マトリックス、ワールド マトリックス (「ビューアー」または「カメラ」の変換)、およびオブジェクトを変換する場合は、各オブジェクトのモデル マトリックスを設定する必要があります。

lighthouse3d.comの「tutorials -> glut」セクションで、いくつかの優れたキックスタート レッスンを見つけることができます。

独自のメッシュ (立方体、球体など) を作成したい場合は、頂点とインデックスを含むメッシュまたはサーフェス クラスを作成する必要があります。rendercall が表示されると、このクラスはすべての頂点と三角形 (立方体/球体など) を描画する必要があります。

于 2012-09-30T12:44:47.040 に答える