2013-12-04 4 views
0

Мне нужно рассчитать нормали для полосы треугольника, и у меня проблема, когда каждый другой треугольник темный и не затененный. Я использую модель плоского оттенка. Я не могу сказать, связано ли это с направлением обмотки. Когда я смотрю под полосу треугольника, я замечаю, что это то же самое, что и верхняя часть, кроме темных областей или переключается. Я думаю, что проблема может быть в том, что нормали поверхности, которые я пытаюсь вычислить, используют общие вершины. Если это так, вы бы порекомендовали переключиться на GL_TRIANGLES? Как бы вы это разрешили?Рисование нормальных граней с треугольными полосками?

Вот что я имею на данный момент. Класс треугольника имеет массив triVerts, в котором есть три объекта Vert. Вертикальные объекты имеют переменные x, y и z.

Triangle currentTri = new Triangle(); 
    int triPointIndex = 0; 
    List<Triangle> triList = new ArrayList<Triangle>()        

    GL11.glBegin(GL11.GL_TRIANGLE_STRIP); 
      int counter1 = 0;    
      float stripZ = 1.0f; 
      float randY; 
      for (float x=0.0f; x<20.0f; x+=2.0f) { 
       if (stripZ == 1.0f) { 
        stripZ = -1.0f; 
       } else { stripZ = 1.0f; } 

       randY = (Float) randYList.get(counter1); 
       counter1 += 1; 

       GL11.glVertex3f(x, randY, stripZ); 

       Vert currentVert = currentTri.triVerts[triPointIndex]; 
       currentVert.x = x; 
       currentVert.y = randY; 
       currentVert.z = stripZ; 

       triPointIndex++; 

       System.out.println(triList); 

       Vector3f normal = new Vector3f(); 
       float Ux = currentTri.triVerts[1].x - currentTri.triVerts[0].x; 
       float Uy = currentTri.triVerts[1].y - currentTri.triVerts[0].y; 
       float Uz = currentTri.triVerts[1].z - currentTri.triVerts[0].z; 

       float Vx = currentTri.triVerts[2].x - currentTri.triVerts[0].x; 
       float Vy = currentTri.triVerts[2].y - currentTri.triVerts[0].y; 
       float Vz = currentTri.triVerts[2].z - currentTri.triVerts[0].z; 

       normal.x = (Uy * Vz) - (Uz * Vy); 
       normal.y = (Uz * Vx) - (Ux * Vz); 
       normal.z = (Ux * Vy) - (Uy * Vx); 

       GL11.glNormal3f(normal.x, normal.y, normal.z); 

       if (triPointIndex == 3) { 
        triList.add(currentTri); 
        Triangle nextTri = new Triangle(); 

        nextTri.triVerts[0] = currentTri.triVerts[1]; 
        nextTri.triVerts[1] = currentTri.triVerts[2]; 
        currentTri = nextTri; 
        triPointIndex = 2; 
       }   

      } 
    GL11.glEnd(); 

ответ

0

Мне пришлось нарисовать пирамиду с примерно 8-10 лицами и некоторое освещение, и я использовал треугольники для правильного освещения. Для каждого треугольника мне приходилось вычислять нормаль. Таким образом, это сработало. Также, я думаю, важно сохранить направление по часовой стрелке/счетчик, в котором вы рисуете вершины для каждого треугольника. Я надеюсь, что это помогает.

 Смежные вопросы

  • Нет связанных вопросов^_^