Рисование нормальных граней треугольными полосами?
Мне приходится вычислять нормали для полосы треугольника, и у меня возникла проблема, когда каждый другой треугольник темный и плохо затенен. Я использую плоскую модель оттенка. Я не могу сказать, имеет ли это отношение к направлению намотки. Когда я смотрю под треугольную полосу, я замечаю, что это то же самое, что и верх, за исключением темных областей или переключений. Я думаю, что проблема может быть в том, что нормали поверхности, которые я пытаюсь вычислить, используют общие вершины. Если это так, вы бы порекомендовали перейти на GL_TRIANGLES? Как бы вы решили это?
Вот что я имею сейчас. Класс треугольника имеет массив triVerts, который имеет три объекта Vert. У объектов 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();
1 ответ
Я должен был нарисовать пирамиду с 8-10 лицами и немного освещения, и я использовал треугольники, чтобы быть правильно освещенным. Для каждого треугольника мне нужно было рассчитать нормаль. Таким образом, это сработало. Также я думаю, что важно сохранить смысл по часовой стрелке / против часовой стрелки, в котором вы рисуете вершины для каждого треугольника. Я надеюсь, что это помогает.