Вычисление вершинных нормалей четырехугольника - PullRequest
3 голосов
/ 21 марта 2012

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

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 ....

1 Ответ

7 голосов
/ 21 марта 2012

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

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

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

Итак, нормальный на v1 равен

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

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

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

...