2012-01-28 10 views
0

OpenGLを使用してWRL(VRML)ファイルに記述されているオブジェクトをモデル化しようとしています。glDrawElementsを使用してWRL(VRML)ファイルからオブジェクトを描画する

私は実際にファイルを解析することには関心がありません。私はその部分がかなりストレートであると考えています。この段階では、頂点配列とインデックス配列をハードコードして、WRL入力ファイルを一般化できるようにこの関数の仕組みをよく理解できるようにしようとしています。

私は基本的なボックス(直角プリズム)モデルを最初に試しています。

GLfloat vertices[] = { 
    -0.200000, -0.025000, -0.050000, 
    -0.200000, -0.025000, 0.050000, 
    -0.200000, 0.025000, -0.050000, 
    -0.200000, 0.025000, 0.050000, 
     0.200000, -0.025000, -0.050000, 
     0.200000, -0.025000, 0.050000, 
     0.200000, 0.025000, -0.050000, 
     0.200000, 0.025000, 0.050000 
}; 

と、このインデックス配列:

GLubyte indices[] = { 
    7, 3, 5, -1, 5, 3, 1, -1, 
    6, 2, 7, -1, 7, 2, 3, -1, 
    4, 0, 6, -1, 6, 0, 2, -1, 
    5, 1, 4, -1, 4, 1, 0, -1, 
    2, 0, 3, -1, 3, 0, 1, -1, 
    4, 6, 5, -1, 5, 6, 7, -1 
}; 

WRLファイルCoordinate3 {point []}IndexedFaceSet {coordIndex []}から直接来た私は現在、この頂点配列を持っています。

私はその後呼び出すことで、頂点配列の機能を有効にします。

glEnableClientState(GL_VERTEX_ARRAY);

とglVertexPointerを設定する:

glVertexPointer(3, GL_FLOAT, 0, vertices);

最終的に私はglDrawElementsボックスを描画する機能を使用します。

glDrawElements(GL_POLYGON, 24, GL_UNSIGNED_BYTE, indices);

0123その後、

と頂点配列の機能を無効にする:

glDisableClientState(GL_VERTEX_ARRAY);

正しいのであれば、この後、私は描画するボックスを期待する、と私はglDrawElements(GL_POINTS, 24, GL_UNSIGNED_BYTE, indices);を使用するときにどのようにepectedとして、それは8つの頂点を示しています頂点が線で結合され、ボックスが期待通りに表示されます(途中にポイントがある場合を除き、カウント引数として26を使用すると、中央のポイントが消えます)

ただし、GL_POLYGONまたはGL_LINE_LOOP glDrawElementsの最初の引数で、私はゴミを得る。明らかに8つの頂点がありますが、それらは本当に奇妙な方法で結合されています。

私は今はかなり混乱しています。私はこれを正しくやっているのかどうかもわかりません。おそらく、誰かが少なくとも私を正しい方向に向けるだろうか?

答えて

0

直角プリズムはGL_POLYGONではありません。その単語の単数形:ポリゴンに注意してください。 のように1つのポリゴン。直角プリズムは、1つではなく、多くのポリゴンで構成されています。

あなたがしたいものは、GL_TRIANGLESを描くことです。ボックスを構成する三角形のそれぞれを示すインデックスリストを作成します。つまり、各ボックスの面は2つの三角形でできているので、合計で12の三角形が必要です。それは36指標を意味します。

+0

これはもっと複雑な3Dシェイプでも機能しますか、これをレンダリングするより良い方法がありますか? – jacobappleton

+0

多かれ少なかれ、すべてがレンダリングされる方法です。 'GL_TRIANGLE_STRIP'を使うこともできますが、セットアップ作業が必要です。インデックスリストを正しく作成する必要があります。 –

関連する問題