Appleのサンプルコードに基づいて、OpenGL-ESでかなり基本的な形状を作っています。彼らは、最初の配列へのインデックスの配列を持つ点の配列を使用し、3つのインデックスの各セットはポリゴンを作成します。それはすべて素晴らしいです、私は私が望む形を作ることができます。シェイプを正しくシェイプするには、各ポリゴンの各頂点の法線を計算する必要があると思います。最初は形状が直方体なので非常に簡単でしたが、私はこれらの法線を自動的に作成したいと考えています。ポリゴンの2つの辺のベクトル(すべてのポリゴンはここでは三角形です)を取得し、そのポリゴンのすべての頂点にそのクロス積を使用すれば十分です。その後、私は形状を描くために以下のようなコードを使用します。GLKit/OpenGL-ESで法線を自動的に計算する
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, triangleVertices);
glEnableVertexAttribArray(GLKVertexAttribColor);
glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, 0, triangleColours);
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 0, triangleNormals);
glDrawArrays(GL_TRIANGLES, 0, 48);
glDisableVertexAttribArray(GLKVertexAttribPosition);
glDisableVertexAttribArray(GLKVertexAttribColor);
glDisableVertexAttribArray(GLKVertexAttribNormal);
私はこれを手動で行う必要がある理由を理解しています。私は、サーフェスに垂直なベクトル以外のものが必要な場合があると確信していますが、これがもっともポピュラーなユースケースであることも確信しています。明白な何かを逃したことがありますか? glCalculateNormals()は素晴らしいでしょう。
//答えは以下の通りです 法線で塗りつぶしたいGLKVector3 []を渡します。もう1つは頂点(それぞれ3つはポリゴンにグループ化されています)と頂点の数です。
- (void) calculateSurfaceNormals: (GLKVector3 *) normals forVertices: (GLKVector3 *)incomingVertices count:(int) numOfVertices
{
for(int i = 0; i < numOfVertices; i+=3)
{
GLKVector3 vector1 = GLKVector3Subtract(incomingVertices[i+1],incomingVertices[i]);
GLKVector3 vector2 = GLKVector3Subtract(incomingVertices[i+2],incomingVertices[i]);
GLKVector3 normal = GLKVector3Normalize(GLKVector3CrossProduct(vector1, vector2));
normals[i] = normal;
normals[i+1] = normal;
normals[i+2] = normal;
}
}
私は自分のケースが大部分のケースだと思っていましたが、それが通常どのように行われていない場合、私はそれが手動の仕事であることを理解することができます。私は主にブロックが欲しいので、私はおそらく私のシステムに固執するでしょう。私は12のポリゴンと36の頂点を持っていますが、私は8つの法線しか計算していませんが、OpenGLにどのように伝えるのですか?頂点に合わせるために36の法線の配列が必要ですか?法線を同じ順序で配置しますか?これは、2つのポリゴンが頂点を共有するとき、またはノーマルと頂点をリンクする方法が存在するときに繰り返されるものがあることを意味しますか? – Craig
@Craig常に頂点ごとに1つの法線があります。法線を計算する場合(面単位)、面の各頂点ごとに各面法線を繰り返す必要があります。頂点ごとの法線を計算すると、頂点が実際に頂点と同じように各頂点の法線が繰り返されます。概念的には、頂点はその属性すべてであり、位置だけでなく、残念なことに頂点とも呼ばれるOpenGLである。 –
@Craigしかし、頂点ごとの法線(ストレージ効率に関して)の利点は、各一意の頂点が同じ法線を持つため、インデックス配列(および 'glDrawElements')を使用して重複を完全に減らすことができるということです。ユニークな位置を持つ各頂点が複数の異なる法線を持つ可能性があるため、面ごとの法線では、インデックスは何も購入しません。なぜなら、とにかに頂点を複製する必要があるからです。 –