我有一个场景和一个放置在某个坐标中的对象。我可以使用 glTranslate(center) 转换对象,然后使用 glRotate...
但是我如何不使用角度而是使用顶部和向前的方向来旋转对象?
谢谢
我正在寻找的是模型坐标系和全局坐标系之间的转换。
我有一个场景和一个放置在某个坐标中的对象。我可以使用 glTranslate(center) 转换对象,然后使用 glRotate...
但是我如何不使用角度而是使用顶部和向前的方向来旋转对象?
谢谢
我正在寻找的是模型坐标系和全局坐标系之间的转换。
假设您知道对象空间中对象的 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
.
[*] 如果你只有三个中的两个,比如top和forward ,你可以很容易地用叉积计算边。如果它们没有标准化,只需将它们标准化。如果它们不是正交的,那一切都会变得更加棘手。
由于 OpenGL 仅适用于矩阵,因此没有top、bottom等概念。
你必须在你想要给出的旋转和所需的方向之间找到一个对应关系。由于glRotates(angle,x,y,z,)
想要角度为度数,您可以只使用二维数组并存储所有 16 种可能性(从top、bottom、left、right之一到相同的一个.. 否则您可以从实际中看到需要多少 90° 步长位置到新位置并将值乘以 90..
例如:
从上到下 = 2 步 = 180°
从右到上 = 后退 1 步 = -90°