通过另一个方向旋转方向矢量

时间:2018-04-04 06:41:37

标签: glsl shader hlsl cg

我有一个向上指向(0, 1, 0)的方向向量(A)我希望能够在着色器中将其旋转到另一个方向,但只能在一个轴上旋转,在此case,Z轴。这可以使用向量(B)或标量来完成。

例如,如果没有旋转,矢量应指向顶部(0, 1, 0),但顺时针旋转90°,矢量应指向(1, 0, 0)

enter image description here

1 个答案:

答案 0 :(得分:1)

如果旋转轴始终是z轴(0,0,1),并且向量A到xy平面的投影应该在向量B上,那么解决方案是:

vec3 A, B;

vec3 AB = vec3(length(A.xy) * normalize(B.xy), A.z);

一个更通用的解决方案,具有任意的,标准化的旋转轴R将是:

vec3 A, B;

vec3 R; // rotation axis (normalized)

vec3 A_r   = R * dot(A, R); // component of A, in the direction of R
vec3 A_prj = A - A_r;       // component of A, in the rotation plane

vec3 B_r   = R * dot(B, R); // component of B, in the direction of R
vec3 B_prj = B - B_r;       // component of B, in the rotation plane

vec3 AB    = length(A_prj) * normalize(B_prj) + A_r;