2016-01-29 9 views
0

Что касается правильного преобразования Normal (который является не позицией) из Object space в World space, мы умножаем его на инверсию матрицы модели/_World2Object (в Unity).Трансформация Нормальная и касательная от объектного пространства до космоса?

Тогда почему тангенс (который касается нормали и направление также - его не позиция) умножается на Матрицу модели/_Object2World (в единстве), чтобы преобразовать ее в пространство Мира?

например код: Код для чтения касательного пространства нормального в шейдер:

o.normalWorld = normalize(mul(v.normal, _World2Object)); 
o.tangentWorld = normalize(mul(_Object2World, v.tangent)); 
o.binormalWorld = normalize(cross(o.normalWorld, o.tangentWorld) * v.tangent.w); 

ответ

4

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

(Источник: Wikibooks)

Для лучшей визуализации я нарисовал немного изображение: Normal & Tangent transformation

Касательная является направление на поверхности, и поэтому, если ось у сжато это делает то же самое следует за поверхностью (поэтому используется модельная матрица).

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

+0

Отлично Спасибо ! – user2259784

0

Я выяснил, как работает ваш код. Если рассматривать матрицу по правилам векторного умножения, вы можете выяснить следующее:

v * m <=> m^-1 * v 

где

v is vector(row or column, regarding to it's position) 
m is matrix 
^-1 is inverse operator 

так, у вас есть два одинаковых трансформируют альтернативы:

o.normalWorld = normalize(mul(v.normal, _World2Object)); 
<=> 
o.normalWorld = normalize(mul(_Object2World, v.normal));