Применение преобразований к 3D-моделям - нормали pb - PullRequest
1 голос
/ 10 ноября 2008

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

Ответы [ 5 ]

2 голосов
/ 10 ноября 2008

Вы можете применить почти одинаковые преобразования для обоих, но помните две вещи:

  • Нормы - это направления, поэтому позиционная часть матрицы 4х4 не должна применяться. Чтобы избежать его применения, вы можете либо отформатировать вектор как Vector (x, y, z, 0) перед умножением на матрицу, либо использовать специальную функцию TransformVector (), чтобы избежать инструкций, которые умножатся на ноль.
  • Если применяемая матрица содержит шкалу, ваш нормальный будет масштабироваться, Это означает, что если вы делаете типичный N.L освещение точечный продукт ваш результат будет ярче или темнее его должно быть. Обычно вы хотите нормализовать после применения преобразовать или убедиться, что преобразование не нормализует нормальный (что обратная транспонирование матрицы для.)
2 голосов
/ 10 ноября 2008

Вы должны посмотреть на преобразование нормалей .

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

1 голос
/ 10 ноября 2008

Цитата Родриго Лопес: Нормы - это направления, поэтому позиционная часть матрицы 4х4 не должна применяться, хотя перенормировка все равно исправит .

перенормировка не исправит это: предположим, что нормаль равна (1,0,0), затем переведите ее с (-2,0,0) => нормаль будет (-1,0,0), которая нормализована и неправильно, потому что нормаль должна оставаться прежней.

1 голос
/ 10 ноября 2008

Преобразование вектора отличается от преобразования точки - преобразование нельзя применить, только повороты.

0 голосов
/ 10 ноября 2008

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

Кроме того, вам нужно рассматривать w-координату нормали как 0 (не 1, как с точками) при ее преобразовании.

...