Что представляют собой нормали (vn) в файлах wavefront.obj?

У меня есть трехмерная сетка в файле obj, который был результатом алгоритма трехмерной реконструкции лица. Проблема в том, что алгоритм отражает лицо по 2-й оси, т.е. каждая вершина v x y z находится в «реальности» v -x y z.

Я попробовал очевидный способ инвертировать все крестики, он работает, но теперь сетка имеет инвертированную ориентацию граней. Я смог исправить это, применив Filters -> Normals, Curvatures and Orientation -> Invert Faces Orientation в MeshLab.

Проблема в том, что я не могу понять, что делает этот вариант или почему мое исходное исправление не сработало, вы можете объяснить? Кроме того, не могли бы вы объяснить, что геометрически представляют нормали в формате wavefront.obj?


person Fakher Mokadem    schedule 24.10.2019    source источник


Ответы (1)


Если вы инвертируете знак координат X в строках, начинающихся с «v», вам необходимо также изменить знак X в линиях «vn», которые представляют нормаль к вершине сетки. Вы можете сделать это очень легко с помощью фильтра meshlab "Per vertex Normal Function" и выражения:

nx = -nx
ny = ny
nz = nz

В любом случае, то, что «алгоритм отражает лицо по 2-й оси», звучит странно. Скорее всего, это не изменение знака координат X, а поворот вашей сетки на 90 градусов из-за того, что ваша программа настроена как «Ось Z вверх» вместо «Ось Y вверх». Это вращение изменит знак одной координаты, а также поменяет местами значения ваших координат. Я предлагаю пересмотреть это и понять, является ли ваш алгоритм «зеркальным отображением X» или «переориентацией» входной сетки.

person Rockcat    schedule 24.10.2019