0

コードへのリンク

私はこのコードで約2週間苦労しています。新しいOpenGLESプロジェクトの作成時に生成された標準のアップルボイラープレートコードを使用して、新しいOpenGLプロジェクトを作成しました。通常、2つの回転する立方体で構成されます。

立方体をピラミッド(三角形ベース)に変更することにしました。色が正しくレンダリングされていないため、ピラミッドが黒であるという事実を除いて、コードを機能させることができました。最初は普通だと思っていましたが、正しいと思います。誰かがこの問題で私を助けてくれるなら、私は最も感謝するでしょう。すべての座標は、私が作成したヘッダーファイルにあります。


私はまた、通常の数学のいくつかが出ていたことを発見しました

GLfloat norms [36] = {

0, -1, 0,
0, -1, 0,
0, -1, 0,

1, 0.25, -0.5,
1, 0.25, -0.5,
1, 0.25, -0.5,

-1, 0.25, -0.5,
-1, 0.25, -0.5,
-1, 0.25, -0.5,

0, 0.5, 1,
0, 0.5, 1,
0, 0.5, 1
};

これらは正しい規範です。すべてのあなたの助けをありがとうGC

回転するピラミッドの画像

4

1 に答える 1

1

一度に2つの頂点配列をバインドすることはできません(glBindVertexArrayOES)。1つだけ作成してから、すべてのデータをそこに入れる必要があります。このアプローチを試してください:

glGenVertexArraysOES(1, &_vertexArray); //create vertex array
glBindVertexArrayOES(_vertexArray);

glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(verts) + sizeof(norms), NULL, GL_STATIC_DRAW); //create vertex buffer big enough for both verts and norms and pass NULL as data..
uint8_t *ptr = (uint8_t *)glMapBufferOES(GL_ARRAY_BUFFER, GL_WRITE_ONLY_OES); //map buffer to pass data to it
memcpy(ptr, verts, sizeof(verts)); //copy verts
memcpy(ptr+sizeof(verts), norms, sizeof(norms)); //copy norms to position after verts
glUnmapBufferOES(GL_ARRAY_BUFFER);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); //tell GL where verts are in buffer
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(sizeof(verts))); //tell GL where norms are in buffer
glBindVertexArrayOES(0);

法線のチェックまたは計算について:

クロス積を使用して、法線を計算し、鋭いエッジ(ヒッチがあなたの場合)をチェックできます。位置A、B、Cで定義された三角形ごとに:

     s1 = B-A //s1 and s2 are just for easier reading
     s2 = C-A
     N = s1 x s2 //N is normal (not quite ready)
     (cross product:) 
     N.x = s1.y*s2.z - s2.y*s1.z
     N.y = s1.z*s2.x - s2.z*s1.x
     N.z = s1.x*s2.y - s2.x*s1.y

ABCは任意の方向に向けることができるので、反対方向に法線を回す必要があるかもしれません。ドット積を使用してこの情報を取得できます。あなたの場合、形状の中心に近く、上にない点を取ります。それを定義する三角形のいずれか(ベクトルCenter(0,0,0)で十分かもしれません)。ここで、A、B、C、Nごとに:

vector Average = (A+B+C)/3 //center of a triangle
if(dotProduct(N, Center-Average)  >  0) N = N * -1
(dotProduct:)
dot(M,N) = M.x*N.x + M.y*N.y + M.z*N.z

その後、各法線を正規化する必要があります(各コンポーネントを法線の長さで除算すると、各法線の長さは1になります)または、正規化フラグを次のように設定できます:glVertexAttribPointer(GLKVertexAttribNormal、3、GL_FLOAT、GL_TRUE .. ..

于 2012-08-20T11:05:35.483 に答える