0

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

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

谢谢

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

4

2 回答 2

2

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

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

并假设您在世界空间中有 3 个其他正交归一化轴,指示对象的顶部前向侧向[*]:

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 ,你可以很容易地用叉积计算边。如果它们没有标准化,只需将它们标准化。如果它们不是正交的,那一切都会变得更加棘手。

于 2010-04-10T16:39:08.763 回答
0

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

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

例如:

从上到下 = 2 步 = 180°

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

于 2010-04-10T14:51:52.847 回答