Как Blender вычисляет нормали вершин?
Я пытаюсь вычислить нормали вершин для различных игровых ресурсов. Нормы, которые я вычисляю, используются для "раздувания" модели (чтобы нарисовать за реальной моделью, получая толстый контур).
В настоящее время я вычисляю нормальное для каждого лица и усредняю все из них (несколько других вопросов по переполнению стека предлагают этот подход). Однако это не работает для таких острых углов, как этот (нормали соседних граней помечены оранжевым, нормаль, которую я пытаюсь вычислить, обведена зеленым).
Объект выглядит как маленький постамент, и мы смотрим в передний левый угол. Есть три смежные грани (нижняя грань не видна; ее нормальные точки направлены вниз).
Блендер вычисляет превосходную нормаль, которая лежит прямо в середине нормалей трех граней; кажется, что он каким-то образом вычисляет нормаль, которая имеет минимальное вращение для каждой из трех граней нормали. Норма Блендера также не меняется, когда квадранты триангулированы по-разному.
Усреднение нормалей граней дает мне другую нормаль, которая немного направлена вверх по оси Z (-0,45, -0,89, +0,08). Раздувание моей модели таким способом не дает хорошего контура, потому что нижняя грань контура смещена вверх и не охватывает исходную модель.
Я попытался взглянуть на исходный код Blender, но не смог найти то, что искал. Если кто-нибудь может указать мне на алгоритм в источнике Blender, я бы тоже принял это.
1 ответ
Вес поверхности нормали по углу лица, где они соединяются. Это обычная практика в рендеринге поверхностей (см. Обсуждение здесь: http://www.bytehazard.com/code/vertnorm.html), и она гарантирует, что ваша нижняя грань утяжелена сильнее, чем две наклонные боковые грани. Я не знаю, если Блендер делает это по-другому, но вы должны попробовать.