【问题标题】:How to position object using forward, top and center coordinates in opengl如何在opengl中使用前向,顶部和中心坐标定位对象
【发布时间】:2010-04-11 00:45:51
【问题描述】:

我有一个场景和一个放置在某个坐标中的对象。我可以使用转换对象 glTranslate(center) 然后 glRotate...

但是我如何不使用角度而是使用向上和向前的方向来旋转对象?

谢谢

我正在寻找的是模型坐标系和全局坐标系之间的转换。

【问题讨论】:

    标签: opengl positioning


    【解决方案1】:

    假设您知道对象空间中对象的 3 个轴。为简单起见,我们假设这些是笛卡尔坐标轴(如果不是这种情况,可以应用下面描述的过程两次来解决这个问题):

    ox = (1, 0, 0)
    oy = (0, 1, 0)
    oz = (0, 0, 1)
    

    假设您在世界空间中有 3 个其他 正交归一化 轴,分别表示 topforward和对象的侧面方向[*]:

    wx = (wx.x, wx.y, wx.z)
    wy = (wy.x, wy.y, wy.z)
    wz = (wz.x, wz.y, wz.z)
    

    那么以下(假设为列向量)是一个旋转矩阵,将您从对象空间带到世界空间:

        [ wx.x  wx.y  wx.z ]
    M = [ wy.x  wy.y  wy.z ]
        [ wz.x  wz.y  wz.z ]
    

    这是一个旋转矩阵,因为行列式是 1(正交和归一化线)。要验证它从世界空间到对象空间,只需注意 M*wx = (1, 0, 0) 等是如何进行的。

    现在您想要完全相反:从对象空间到世界空间。只需反转矩阵。在这种情况下,逆向与转置相同,因此您的最终答案是:

    objectToWorld = transpose(M)
    

    剩下两件事:

    1) 在 OpenGL 中加载这个矩阵。 glMultMatrix 将为您执行此操作(请注意,glMultMatrix 是主要列,需要 4x4 矩阵):

    double objectToWorld[] = [ wx.x, wy.x, wz.x, 0, 
                               wx.y, wy.y, wz.y, 0, 
                               wx.z, wy.z, wz.z, 0,
                                  0,    0,    0, 1 ];
    glMultMatrixd( objectToWorld ); 
    

    2) 翻译。只需通过调用glTranslate 来完成此操作。

    [*] 如果你只有三个中的两个,比如 topforward,你可以很容易地用叉积计算 side .如果它们没有标准化,只需将它们标准化。如果它们不是正交的,那一切都会变得更加棘手。

    【讨论】:

      【解决方案2】:

      由于 OpenGL 仅适用于矩阵,因此没有 topbottom 等概念..

      你必须在你想要的旋转和所需的方向之间找到一个对应关系。由于glRotates(angle,x,y,z,) 想要一个以度为单位的角度,您可以只使用一个二维数组并存储所有 16 种可能性(从 topbottomleft之一>, right 到相同的位置之一.. 否则您可以看到从实际位置到新位置需要多少 90° 步长并将该值乘以 90..

      例如:

      从上到下 = 2 步 = 180°

      从右到上 = 后退 1 步 = -90°

      【讨论】:

      • 让我们更清楚——我想将坐标系从一个转换为另一个
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      相关资源
      最近更新 更多