2013-06-13 3 views
1

Я нарисовал сложную трехмерную форму с использованием CC3MeshNode в cocos3d, но эта форма не изменяется (теневые и яркие места в зависимости от положения) от источника света (лампы), который я установил в мир, где, если я использую один из методов populateAs, чтобы нарисовать что-то вроде сферы, он будет зависеть от источника света. Что мне делать, когда вручную рисую CC3MeshNode, чтобы он попадал под действие света.CC3MeshNode не влияет на свет в cocos3d

Вот пример кода рисования прямоугольника вручную в 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

Я думаю, что проблема в том, что вам нужно поставить вершинные нормали для вашей сетки. Для корректного управления расчетами освещения необходимы нормали. Процедуры автоматического заполнения сферы и т. Д. Генерируют и сохраняют вершинные нормали в сетке. Desktop OpenGL будет генерировать нормали для сетки без них, когда вы используете glEnable (GL_AUTO_NORMAL), но эта функциональность не существует на мобильных устройствах, по крайней мере, не в OpenGL ES 2.0.

+0

Правильно, вы мой друг, я добавил нормали, и это сработало. благодаря –