Glsl 将方向向量旋转另一个方向
我有一个指向上的方向向量(a),Glsl 将方向向量旋转另一个方向,glsl,shader,hlsl,cg,Glsl,Shader,Hlsl,Cg,我有一个指向上的方向向量(a),(0,1,0),我希望能够在着色器中将其旋转到另一个方向,但仅在一个轴上,在本例中是Z轴。这可以使用向量(B)或标量来完成 例如,不旋转时,矢量应指向顶部(0,1,0),但顺时针旋转90°时,矢量应指向(1,0,0) 如果旋转轴始终是z轴(0,0,1),且向量A到xy平面的投影应在向量B上,则解决方案为: vec3 A, B; vec3 AB = vec3(length(A.xy) * normalize(B.xy), A.z); 对于任意的标准化旋转轴R,更
(0,1,0)
,我希望能够在着色器中将其旋转到另一个方向,但仅在一个轴上,在本例中是Z轴。这可以使用向量(B)或标量来完成
例如,不旋转时,矢量应指向顶部(0,1,0)
,但顺时针旋转90°时,矢量应指向(1,0,0)
如果旋转轴始终是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;
您应该将其与旋转矩阵相乘以旋转它。对于任意旋转轴,可以使用此处的公式:对于XYZ轴旋转,可以使用此处的公式