Как Blender вычисляет нормали вершин?

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

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

пример

Объект выглядит как маленький постамент, и мы смотрим в передний левый угол. Есть три смежные грани (нижняя грань не видна; ее нормальные точки направлены вниз).

Блендер вычисляет превосходную нормаль, которая лежит прямо в середине нормалей трех граней; кажется, что он каким-то образом вычисляет нормаль, которая имеет минимальное вращение для каждой из трех граней нормали. Норма Блендера также не меняется, когда квадранты триангулированы по-разному.

Усреднение нормалей граней дает мне другую нормаль, которая немного направлена ​​вверх по оси Z (-0,45, -0,89, +0,08). Раздувание моей модели таким способом не дает хорошего контура, потому что нижняя грань контура смещена вверх и не охватывает исходную модель.

Я попытался взглянуть на исходный код Blender, но не смог найти то, что искал. Если кто-нибудь может указать мне на алгоритм в источнике Blender, я бы тоже принял это.

1 ответ

Решение

Вес поверхности нормали по углу лица, где они соединяются. Это обычная практика в рендеринге поверхностей (см. Обсуждение здесь: http://www.bytehazard.com/code/vertnorm.html), и она гарантирует, что ваша нижняя грань утяжелена сильнее, чем две наклонные боковые грани. Я не знаю, если Блендер делает это по-другому, но вы должны попробовать.

Другие вопросы по тегам