CC3MeshNode不受cocos3d中的光影响

时间:2013-06-13 10:08:00

标签: ios opengl-es opengl-es-2.0 cocos3d

我在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]; 

1 个答案:

答案 0 :(得分:1)

我认为问题是您需要为网格物体提供顶点法线。照明计算需要法线才能正常运行。自动填充球体等的例程正在网格中生成并存储顶点法线。当您使用glEnable(GL_AUTO_NORMAL)时,桌面OpenGL将为没有它们的网格生成法线,但移动设备中不存在此功能,至少在OpenGL ES 2.0中不存在。