OpenGL: поиск нормального унитарного вектора вершины - PullRequest
1 голос
/ 22 ноября 2010

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

Я прочитал в OpenGL Superbible следующее:

void m3dFindNormal(M3DVector3f vNormal, const M3DVector3f vP1, const M3DVector3f vP2, const M3DVector3f vP3);

Чтобы использовать эту функцию, передайте ей вектор хранить нормаль и три вектора (каждый массив из трех чисел с плавающей точкой) от вашего многоугольника или треугольника (указано в обмотке против часовой стрелки порядок). Обратите внимание, что это вернулось нормально вектор не обязательно единичная длина (Нормированный).

Я понимаю, что порядок, в котором я передаю вершины (по часовой стрелке или против часовой стрелки), определяет ориентацию вектора нормали, поэтому мне интересно, как заставить функцию работать с файлом этого формата .

Ответы [ 2 ]

2 голосов
/ 22 ноября 2010

Хм, этот формат выглядит как OBJ, но с цветами и без нормалей и текстурных координат. Похоже, это не очень хороший выбор! Но если вы действительно хотите придерживаться этого ...

Мой совет нет. 0 это:

Используйте другой формат, серьезно. :) Необработанный двоичный дамп вершин (позиции + нормали + координаты текстуры + цвета + все что угодно), а затем индексы, как правило, являются простейшим решением. И если вы действительно * действительно * хотите использовать .off ...

Мой совет нет. 1 это:

  • импортировать его в Blender (написать скрипт для импорта на Python или использовать другой инструмент для изменения формата)
  • пусть Блендер вычислит для вас нормали (это будет хорошо!),
  • экспорт в любой формат с нормальными значениями.

Если вы по какой-либо причине не хотите (или не можете) сделать это, есть совет № 2. Как самостоятельно генерировать нормали:

  • для каждого лица, рассчитать его временное нормальное лицо (для лица A,B,C, это (B-A)x(C-B)). Не масштабируйте его до длины = 1 - чем больше площадь лица, тем длиннее будет получающийся вектор нормали, и это то, что мы хотим (пока).
  • для каждой вершины, суммируйте все нормали лица от граней, соприкасающихся с этим вектором (здесь удобна ненормализация нормали для лица - вы получите некоторую «взвешенную сумму» с площадью лица является весом) и , затем нормализует результирующий вектор. Это хорошее приближение для каждой вершины, которое вы можете использовать.
0 голосов
/ 22 ноября 2010

Попробуйте, порядок зависит от программы, которая создала файл .off, описание формата, кажется, не определяет нормальную ориентацию.Я бы просто взял порядок, в котором они появляются в списке индексов, и передал его функции.Если это не сработает, передайте их в обратном порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...