Вычисление нормалей для карты высот



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



НЕЗАФИКСИРОВАННЫЙ ИСТОЧНИК УДАЛЕН



Править:
Попробовал 2 новых подхода:



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



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


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



Введите описание изображения здесь



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



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



НЕЗАФИКСИРОВАННЫЙ ИСТОЧНИК УДАЛЕН



Введите описание изображения здесь



Правка 2:
Определение моих точек зрения:
OL, или, UL, UR-угловые вершины плоскости, которая должна быть нарисована.



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


EDIT3:



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



Сейчас он прекрасен.
Введите описание изображения здесь

640   1  

1 ответ:

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

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

  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) / /
Обратите внимание, что эти вычисления предполагают, что ваша ось x выровнена вправо, а ось z-вниз.

Comments

    Ничего не найдено.