Вычисление нормалей вершин четырехугольника

Допустим, у меня есть следующий массив:

float QuadVertices[4 * 2];
float QuadNormals[4 * 2];

Который я заполняю следующим образом:

//Fill vertices for a 2d quad
Renderer->FillVertices(QuadVertices,GL_QUADS,x,y,width,height);

Теперь на данный момент все в порядке, я могу визуализировать четырехугольник, текстурировать его, растягивать и все такое.

Но теперь я хочу вычислить нормали четырехугольника:

for (int i = 0; i < 8;i++)
{
    QuadNormals[i] = ??
}

НО я не могу понять, как я должен вычислять нормали простого двумерного массива вершин, который содержит либо 4 вершины GL_QUADS, либо 6 вершин GL_TRIANGLES....


person user1010005    schedule 21.03.2012    source источник


Ответы (1)


Если у вас есть это -

   v1        v2
    +---------+
    |         | 
    |         |
    +---------+
    v3        v4

Где v1..v4 — это вершины вашего четырехугольника, то для вычисления нормали в v1 вы должны вычислить векторы вдоль двух ребер, на которых он находится, а затем вычислить векторное произведение этих вершин.

Итак, норма в v1 равна

CrossProduct((v2-v1), (v3-v1))

Вы можете повторить это для каждой вершины, хотя все они будут одинаковыми, если четырехугольник «плоский».

Если у вас есть другие четырехугольники, связанные с этим, вы можете вычислить нормаль для каждого четырехугольника, а затем назначить среднее значение всех связанных четырехугольников нормалью для этой вершины.

person jcoder    schedule 21.03.2012
comment
Ба, просто glEnable(GL_NORMALIZE) :) - person genpfault; 21.03.2012
comment
Спасибо! Честно говоря, я ожидал чего-то ужасно сложного :-D - person user1010005; 21.03.2012