2014-12-06 9 views
2

Я пытаюсь вычислить нормаль поверхности двумерного многоугольника. Я использую метод Ньюэлла из вики OpenGL для вычисления нормальной поверхности. https://www.opengl.org/wiki/Calculating_a_Surface_Normal Из моего понимания нормаль должна быть в направлении y, но она всегда возвращает [0, 0, 0]. Значение y изменяется на -1 на второй итерации и возвращается к нулю на четвертой итерации.Вычислить нормальный вектор многоугольника - метод Ньюэллса

p = [[0, 0, 0] 
    [1, 0, 0] 
    [0, 0, 1] 
    [1, 0, 1]] 

function calcNormal(p) { 
    var normal = [0, 0, 0]; 
    for(var i = 0; i < p.length; i++) { 
     var j = (i + 1) % (p.length);  
     normal[0] += (p[i][1] - p[j][1]) * (p[i][2] + p[j][2]); 
     normal[1] += (p[i][2] - p[j][2]) * (p[i][0] + p[j][0]); 
     normal[2] += (p[i][0] - p[j][0]) * (p[i][1] + p[j][1]); 
    } 
    return normal; 
} 

ответ

4

Вы используете дегенеративный полигон для тестирования. Если вы рисуете его в плоскости хг, с вершины пронумерованы от 0 до 3, это выглядит следующим образом:

2 ---- 3 
\ /
    \/
    \/ 
    /\ 
/\ 
/ \ 
0 ---- 1 

Этот полигон не имеет четко определенный нормальный, так как она меняет ориентацию в середине, и складывается над собой.

Если поменять местами последние две вершины:

p = [[0, 0, 0] 
    [1, 0, 0] 
    [1, 0, 1] 
    [0, 0, 1]] 

Это будет выглядеть, и вы должны получить гораздо более значимые результаты:

3 ---- 2 
|  | 
|  | 
|  | 
0 ---- 1 
1

версия OpenGL является неспособность в некоторых случаях, особенно когда многоугольник является 2D и вы обеспечивая более 3-х вершин для расчета (4 в вашем случае). Если вы предоставите только 3 вершины, он будет правильно вычисляться (также подумайте о том, чтобы использовать векторный продукт для нормализации). Вот такой вопрос: link to Game Development Stack Exchange с различными подходами к этой проблеме.

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