【发布时间】:2010-04-11 00:45:51
【问题描述】:
我有一个场景和一个放置在某个坐标中的对象。我可以使用转换对象 glTranslate(center) 然后 glRotate...
但是我如何不使用角度而是使用向上和向前的方向来旋转对象?
谢谢
我正在寻找的是模型坐标系和全局坐标系之间的转换。
【问题讨论】:
标签: opengl positioning
我有一个场景和一个放置在某个坐标中的对象。我可以使用转换对象 glTranslate(center) 然后 glRotate...
但是我如何不使用角度而是使用向上和向前的方向来旋转对象?
谢谢
我正在寻找的是模型坐标系和全局坐标系之间的转换。
【问题讨论】:
标签: opengl positioning
假设您知道对象空间中对象的 3 个轴。为简单起见,我们假设这些是笛卡尔坐标轴(如果不是这种情况,可以应用下面描述的过程两次来解决这个问题):
ox = (1, 0, 0)
oy = (0, 1, 0)
oz = (0, 0, 1)
假设您在世界空间中有 3 个其他 正交 和 归一化 轴,分别表示 top、forward和对象的侧面方向[*]:
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,你可以很容易地用叉积计算 side .如果它们没有标准化,只需将它们标准化。如果它们不是正交的,那一切都会变得更加棘手。
【讨论】:
由于 OpenGL 仅适用于矩阵,因此没有 top、bottom 等概念..
你必须在你想要的旋转和所需的方向之间找到一个对应关系。由于glRotates(angle,x,y,z,) 想要一个以度为单位的角度,您可以只使用一个二维数组并存储所有 16 种可能性(从 top、bottom、left之一>, right 到相同的位置之一.. 否则您可以看到从实际位置到新位置需要多少 90° 步长并将该值乘以 90..
例如:
从上到下 = 2 步 = 180°
从右到上 = 后退 1 步 = -90°
【讨论】: