Недавно я увидел небольшой фрагмент кода где-то в своем шейдере.необходимо скорректировать матрицу поворота, состоящую из векторов, или нет?
код следующим образом (это на самом деле не имеет значения, на каком языке шейдера.)
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
, вместо этого нормализуются, что только что нормализовано на векторе движения до создания матрицы вращения. я не могу понять, почему, почему автор кода не нормализует вектор движения до того, как сделает матрицу вращения?
может кто-нибудь помочь мне избавиться от вопроса, я действительно ценю его. заранее благодарю!
'rot' не является чистой матрицей вращения. Он может включать масштабирование. Это, вероятно, сделано для учета степени стрелки, тогда как голову не следует масштабировать в зависимости от длины стрелки. Но это невозможно сказать, не зная ввода. –
@Nico Schertler. Привет, вы правы, просто отмените масштаб линейного преобразования, если он существует – haoc