如何最简单地将Z轴与一个向量对齐?

4

给定一个点,例如(0,0,0),和一个向量(x,y,z)。最简单的方法是将以(0,0,0)为中心的负Z轴对准指向该向量的方向。欢迎使用OpenGL进行示例,但不是必须的。


我不确定我理解你的问题,你是指旋转坐标轴,使得z轴沿着从(0,0,0)到(x,y,z)的向量方向? - Simon
差不多,但还不够。我有一个向量(x,y,z),描述了我想要Z轴指向的方向。这样清楚吗? - fluffels
5个回答

14

有很多不同的方法可以旋转坐标系以指向给定方向;它们都会使z轴指向您想要的方向,但x轴和y轴的方向可能有所不同。

以下内容可获得最短的旋转,但这可能并不是您想要的。

vec3 target_dir = normalise( vector );
float rot_angle = acos( dot_product(target_dir,z_axis) );
if( fabs(rot_angle) > a_very_small_number )
{
    vec3 rot_axis = normalise( cross_product(target_dir,z_axis) );
    glRotatef( rot_angle, rot_axis.x, rot_axis.y, rot_axis.z );
}

1
感谢您的回答。但请注意,对于OpenGL,glRotatef需要角度(而不是半径),因此应该是glRotatef(-rot_angle / PI * 180,rot_axis.x,rot_axis.y,rot_axis.z); - TimC

1

1
回答我自己的问题,我想到的最好的答案是:
将向量分成“组件”。x 分量是沿 x 轴的位移。如果我们转向三角学,我们有 cos(alpha) = x / vector_magnitude。如果我们计算 RHS,那么我们可以推导出 alpha,这是我们必须围绕 y 轴旋转的量。
然后通过一系列对 glRotatef() 的调用,可以将坐标系与向量对齐。

0

关于旋转坐标(或旋转物体,本质上是一样的)有很多资源可供参考。我从这个网站中学到了很多,包括如何在多个维度中进行编程,特别是如何操作向量


0

页面这里有一个名为“将向量移动到z轴的变换”的部分,看起来是你想要的,或者它的反向操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接