2012-03-21 3 views
2

Допустим, что у меня есть следующий массив:Вычисление вершинных нормалей четверного

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] = ?? 
} 

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

ответ

5

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

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

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

Таким образом, нормаль v1 является

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

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

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

+0

Я должен добавить, что вам также придется нормализовать векторы. – jcoder

+4

Бах, просто 'glEnable (GL_NORMALIZE)' :) – genpfault

+0

Спасибо! Честно говоря, я ожидал чего-то ужасно тяжелого: -D – user1010005