获取向量之间的xyz角?

5 vector glsl rotation

如何获得两个单位向量之间的x,y和z旋转值?我不能使用点积,因为那只会给我一个价值。我想使用旋转矩阵在每个轴上旋转,对于那些我需要在每个轴上的角度差。我只尝试了两种成分的点积,但是有些困惑。是否有快速简便的方法来执行此操作?也许我在两个部分上做错了,但我不知道。最好的办法是,如果有人知道使用glsl方法来执行此操作的话!

Nat*_*han 6

如果要获取两个向量之间的x,y和z角,则取两个向量在所需轴的正交平面上的投影的点积。

也就是说,如果要两个向量之间的z角,请创建原始xy平面向量。为此,制作一个忽略向量z分量的向量。

vec3 u = vec3( ... ); // your input vector
vec3 v = vec3( ... ); // your other input vector
float x_angle = acos( dot( u.yz, v.yz ) );
float y_angle = acos( dot( u.xz, v.xz ) );
float z_angle = acos( dot( u.xy, v.xy ) );
Run Code Online (Sandbox Code Playgroud)

请注意,无论您使用u.xz还是u.zx使用点积都没有关系。只需确保对点积内的两个向量使用相同的顺序。另外,由于表达式中未提及向量长度,因此代码的第3-5行采用单位向量。

还应注意,使用acos可能会导致参数值较小的错误。为了避免这种情况,可以获取2D投影向量之间的差异,并将其与atan2函数一起使用。

编辑

在建议最终目标是构造一个旋转矩阵以重新定向具有相同变换的其他矢量时,我建议使用轴角方法(也称为任意轴旋转)。该方法涉及找到两个向量之间的角度(点积)和围绕该角度的适当旋转轴(叉积)。

第一步,您想使用点积找到两个向量之间的角度。

float angle = acos( dot( u, v ) ); // for unit vectors
Run Code Online (Sandbox Code Playgroud)

接下来,要找到旋转轴,请使用叉积。知道叉积将产生一个垂直于u和的向量v,以任意顺序将它们相交将给出一个适当的轴。

vec3 axis = cross( u, v ); // again, for unit vectors
// normalize this if need be
Run Code Online (Sandbox Code Playgroud)

您将要使用的矩阵形式可以在此Wikipedia文章上的“ 旋转矩阵 ”标题下从轴线和角度找到。我建议存储一些临时值以使计算运行更快。

float c = cos(angle);
float s = sin(angle);
float t = 1 - c;
Run Code Online (Sandbox Code Playgroud)

构造好此矩阵后,只需将其乘以任何向量即可重新应用原始变换。