我在cocos3d中使用CC3MeshNode绘制了一个复杂的3d形状,但是这个形状不受我在世界中设置的光源(灯)影响(阴影和明亮的位置取决于定位),如果我使用其中一个populateAs是绘制类似球体的方法,它会受到光源的影响。 手动绘制CC3MeshNode时应该怎么做才能受到光的影响。
以下是在cocos3d中手动绘制矩形的示例代码
CC3MeshNode *pMeshNode = [[CC3MeshNode alloc] init];
[pMeshNode setIsTouchEnabled:YES];
CC3Mesh* theArrayMesh = [pMeshNode prepareParametricMesh];
// Prepare the vertex content and allocate space for vertices and indices.
[theArrayMesh ensureVertexContent];
theArrayMesh.allocatedVertexCapacity = totalVertexCount;
theArrayMesh.allocatedVertexIndexCapacity = (triangleCount * 3);
GLushort* indices = theArrayMesh.vertexIndices.vertices;
/*
* 1-------0
* | /| -z
* | / | ⥣
* | / | =>+x
* | / |
* | / |
* | / |
* |/ |
* 2-------3
*/
{
[theArrayMesh setVertexLocation: cc3v(3, -3,0) at: 3];
[theArrayMesh setVertexLocation: cc3v(-3, -3,0 ) at: 2];
[theArrayMesh setVertexLocation: cc3v(-3, 3, 0) at: 1];
[theArrayMesh setVertexLocation: cc3v(3, 3, 0) at: 0];
}
GLubyte indxIndx = 0;
GLubyte vtxIndx = 0;
for (int side = 0; side < 1; side++) {
// First trangle of side - CCW from bottom left
indices[indxIndx++] = vtxIndx++; // vertex 0
indices[indxIndx++] = vtxIndx++; // vertex 1
indices[indxIndx++] = vtxIndx; // vertex 2
// Second triangle of side - CCW from bottom left
indices[indxIndx++] = vtxIndx++; // vertex 2
indices[indxIndx++] = vtxIndx++; // vertex 3
indices[indxIndx++] = (vtxIndx - 4); // vertex 0
}
[self addChild:pMeshNode];
答案 0 :(得分:1)
我认为问题是您需要为网格物体提供顶点法线。照明计算需要法线才能正常运行。自动填充球体等的例程正在网格中生成并存储顶点法线。当您使用glEnable(GL_AUTO_NORMAL)时,桌面OpenGL将为没有它们的网格生成法线,但移动设备中不存在此功能,至少在OpenGL ES 2.0中不存在。