2016-10-18 2 views
0

Недавно я увидел небольшой фрагмент кода где-то в своем шейдере.необходимо скорректировать матрицу поворота, состоящую из векторов, или нет?

код следующим образом (это на самом деле не имеет значения, на каком языке шейдера.)

float2 mv = tex2Dlod(_CameraMotionVectorsTexture, uv).rg * _Amplitude; 

// Make a rotation matrix based on the motion vector. 
float2x2 rot = float2x2(mv.y, mv.x, -mv.x, mv.y); 

// Rotate and scale the body of the arrow. 
float2 pos = mul(rot, v.vertex.zy) * _Scale.xy; 

// Normalized variant of the motion vector and the rotation matrix. 
float2 mv_n = normalize(mv); 
float2x2 rot_n = float2x2(mv_n.y, mv_n.x, -mv_n.x, mv_n.y); 

// Rotate and scale the head of the arrow. 
float2 head = float2(v.vertex.x, -abs(v.vertex.x)) * 0.3; 
head *= saturate(color.a); 
pos += mul(rot_n, head) * _Scale.xy; 

, как ваш парень видеть, что матрица гниль была сделана из вектора движения, который не нормализуется. но два вектора оси второй матрицы вращения, называемые rot_n, вместо этого нормализуются, что только что нормализовано на векторе движения до создания матрицы вращения. я не могу понять, почему, почему автор кода не нормализует вектор движения до того, как сделает матрицу вращения?

может кто-нибудь помочь мне избавиться от вопроса, я действительно ценю его. заранее благодарю!

+1

'rot' не является чистой матрицей вращения. Он может включать масштабирование. Это, вероятно, сделано для учета степени стрелки, тогда как голову не следует масштабировать в зависимости от длины стрелки. Но это невозможно сказать, не зная ввода. –

+0

@Nico Schertler. Привет, вы правы, просто отмените масштаб линейного преобразования, если он существует – haoc

ответ

0

может быть включен в масштаб, просто отменить масштаб на нем. Это так?