2015-11-16 4 views
4

У меня есть небольшая проблема расчета нормалей для моей карты высот. Это странное поведение. В верхней и нижней точках нормали хорошо, но в середине они кажутся неправильными. Они освещены точечным светом. ProblemВычисление нормалей для карты высоты

нефиксированной ИСТОЧНИК REMOVED

EDIT: Пробовал 2 новые подходы:

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

Position normal = crossP(vectorize(pOL, pUR), vectorize(pOR, pUL)); 

Я также попытался сделать это на вершине таким образом, но также со странным выходом.

enter image description here

Это предложение Нико сделал:

Это выглядит также довольно странно. Возможно, есть ошибка, как я вычисляю пункты помощи.

нефиксированной ИСТОЧНИК REMOVED

enter image description here

EDIT 2: Определение моих точек: О.Л., ИЛИ, UL, UR являются угловые вершины плоскости, должна быть нарисована.

   postVertPosZ1 postVertPosZ2 
preVertPosX1   pOL   pOR   postVertPosX1 
preVertPosX2   pUL   pUR   postVertPosX2 
       preVertPosZ1 preVertPosZ2 

EDIT3:

Я решил сейчас. Это была глупая ошибка: Я забыл умножить значение y вспомогательных вершин с помощью множителя высоты и пришлось изменить некоторые значения.

Это прекрасно сейчас. enter image description here

+1

Возможный дубликат [Вычисление нормалей в треугольной сетке] (http://stackoverflow.com/questions/6656358/calculating-normals-in-a-triangle-mesh) – legends2k

+0

Релевантно: https: //en.wikipedia. org/wiki/Sobel_operator – sbabbi

ответ

6

Существует множество способов решить эту проблему. Я не встречал тебя. Я предлагаю использовать центральные различия для оценки частных производных поля высоты. Затем используйте кросс-продукт, чтобы получить нормальное значение:

Каждая нормальная вершина может быть рассчитана из четырех ее соседей. Вам не нужен самолет плюс своих соседей:

T 
L O R 
    B 

O является вершина, для которой вы хотите вычислить нормаль. Другие вершины (сверху, справа, внизу, слева) являются его соседями. Тогда мы хотим вычислить центральные разницы в горизонтальном и вертикальном направлении:

  /   2   \ 
horizontal = | height(R) - height(L) | 
      \   0   /

      /   0   \ 
vertical = | height(B) - height(T) | 
      \   2   /

Нормальным является перекрестное произведение этих касательных:

normal = normalize(cross(vertical, horizontal)) 
       // height(L) - height(R) \ \ 
     = normalize | |   2   | | 
        \ \ height(T) - height(B)// 

Обратите внимание, что эти расчеты предполагают, что ваша ось х выровненный по правому краю и по оси z вниз.

+0

Я отредактировал мое сообщение.Возможно, моя ошибка заключается в определении пунктов помощи (prevVertPosX1, ...) – Eskalior

+0

Не могли бы вы добавить, какие соседи они должны быть? Я могу представить, что такое postVertPosX2, но ваша нумерация может быть чем угодно. Так что лучше просто поместите его где-нибудь. –

+0

Я отредактировал его. Но благодаря вам я заметил, что переключил пред и пост позиции Z-Points. Я изменил это, но результат тот же. – Eskalior