gpt4 book ai didi

vector - 获取向量之间的 xyz 角度?

转载 作者:行者123 更新时间:2023-12-02 06:41:04 27 4
gpt4 key购买 nike

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

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

编辑

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

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

float angle = acos( dot( u, v ) ); // for unit vectors

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

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

您想要使用的矩阵形式可以在 Wikipedia article从轴和角度旋转矩阵标题下找到。 。我建议存储一些临时值以使计算运行得更快。

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

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

关于vector - 获取向量之间的 xyz 角度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42554960/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com