Vector 获取向量之间的xyz角度?

Vector 获取向量之间的xyz角度?,vector,rotation,glsl,Vector,Rotation,Glsl,如何获得两个单位向量之间的x、y和z旋转值?我不能使用点积,因为它只给我一个值。我想使用旋转矩阵在每个轴上旋转,对于那些我需要在每个轴上的角度差。 我试过只有两种成分的点积,但我有点困惑。 有没有一种快速简便的方法?也许我在两部分的事情上做错了,但我不知道。 最好是,如果有人知道一个glsl方法来做这件事 如果要获得两个向量之间的x、y和z角,则取两个向量投影到所需轴的正交平面上的点积 也就是说,如果需要两个向量之间的z角,请创建原始向量的xy平面向量。要执行此操作,请创建一个忽略向量z分量的向

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

如果要获得两个向量之间的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 ) );
请注意,使用
u.xz
u.zx
并不重要,因为您将使用点积。只需确保对点积中的两个向量使用相同的顺序即可。此外,代码的第3-5行假定单位向量,因为表达式中没有提及向量长度

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

编辑

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

第一步,使用点积求两个向量之间的角度

float angle = acos( dot( u, v ) ); // for unit vectors
接下来,要找到旋转轴,请使用叉积。知道叉积将产生一个垂直于
u
v
的向量,按任意顺序交叉将得到一个合适的轴

vec3 axis = cross( u, v ); // again, for unit vectors
// normalize this if need be
您将要使用的矩阵形式可以在本页的“从轴和角度旋转矩阵”标题下找到。我建议存储一些临时值以加快计算速度

float c = cos(angle);
float s = sin(angle);
float t = 1 - c;

一旦你构造了这个矩阵,只需将它与任何向量相乘即可重新应用原始变换。

这不太管用:我这样做时u和v是同一个向量,我基本上得到了向量(out=(0,0,1),in=(0,0,1))。它也不适用于其他向量。获取新向量的总体过程是什么?我很想知道你的最终目标是什么。此外,如上所述,如果您使用ACO,那么向量相同可能会有一些奇怪之处。例如,在Lua中,我必须钳制输入,以防止得到NaN。好的。我的目标是得到树轴上旋转的差值,这样我就可以把这些值插入旋转矩阵,然后用它们来旋转另一个向量。然后旋转向量y-axia将与我的另一个向量对齐。在这种情况下,我建议构造一个任意轴旋转矩阵。与其执行三个旋转,还不如选择合适的轴在一个旋转中完成。我会更新我的答案来讨论这个方法。好的。谢谢你的帮助!