【问题标题】:What is the easiest way to align the Z axis with a vector?将 Z 轴与矢量对齐的最简单方法是什么?
【发布时间】:2010-09-16 16:09:50
【问题描述】:

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

【问题讨论】:

  • 不确定我是否理解您的问题,您的意思是旋转轴以使 z 轴位于 (0,0,0) 和 (x, y, z) 之间的矢量方向?
  • 差不多,但不完全。我有一个向量 (x, y, z),它描述了我希望 z 轴指向的方向。是不是更清楚了?

标签: opengl 3d vector alignment matrix


【解决方案1】:

为了回答我自己的问题,我想出的最佳答案是:

将向量分成“分量”。 x 分量是沿 x 轴的位移。如果我们转向三角学,我们有 cos(alpha) = x / vector_magnitude。如果我们计算 RHS,那么我们可以推导出 alpha,这是我们必须绕 y 轴旋转的量。

然后可以通过一系列调用glRotatef()将坐标系与向量对齐

【讨论】:

    【解决方案2】:

    有很多不同的方法可以旋转坐标系以指向给定方向;它们都会使 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 );
    }
    

    【讨论】:

    • 感谢您的回答。但请注意,对于 openGL,glRotatef 采用 angle(不是半径),因此它应该是 glRotatef( -rot_angle/PI*180, rot_axis.x, rot_axis.y, rot_axis.z );
    【解决方案3】:

    有很多关于旋转坐标(或旋转对象,相当于同一件事)的资源。我从this site 那里学到了很多东西,包括如何进行多维编程,尤其是how to manipulate vectors

    【讨论】:

      【解决方案4】:

      here 页面有一个“将矢量移动到 z 轴的转换”部分,其中 似乎是你想要的,或者可能是相反的。

      【讨论】:

        【解决方案5】:

        你可能想看看Diana Gruber's的文章

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-15
          • 2011-05-26
          • 1970-01-01
          • 1970-01-01
          • 2012-02-05
          相关资源
          最近更新 更多