Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Glsl 将方向向量旋转另一个方向_Glsl_Shader_Hlsl_Cg - Fatal编程技术网

Glsl 将方向向量旋转另一个方向

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,更

我有一个指向上的方向向量(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
,更一般的解决方案是:

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轴旋转,可以使用此处的公式