我需要一种简单的方法将我的对象坐标转换为世界坐标,以便我可以在该坐标系中定位它们并进行碰撞检测?
[-1, +1]
。(x,y,z,w)
,其中w
是一个缩放因子。您可以将三维空间中的坐标获取为(x/w, y/w, z/w)
。缩放因子对于某些转换(如透视投影)是必需的,在非齐次坐标中无法实现。C
投影到屏幕上:C' = P * V * M * C
OpenGL内部维护两个矩阵:modelview(模型和视图相乘)和投影。还有一个我们不需要担心的纹理矩阵。当你调用glMatrixMode
时,你在这些矩阵之间切换。你可以使用glLoadIdentity
将当前矩阵替换为单位矩阵。你可以使用像glTranslatef
、glRotatef
或gluProjection
这样的函数对当前矩阵应用变换。每个这样的函数只是创建一个实现特定变换的4x4矩阵,然后将当前矩阵乘以它。你可以在OpenGL 2.1参考页面中查看变换矩阵。
现在是实际答案。你需要为场景中的每个对象维护一个4x4模型矩阵。模型矩阵将包含所有所需的变换,以将模型坐标转换为世界坐标。例如,每次调用glTranslate
时,你都会更新你的模型矩阵:
T = [ 1 0 0 x ]
[ 0 1 0 y ]
[ 0 0 1 z ]
[ 0 0 0 1 ]
M' = M * T
然后,您可以使用模型矩阵将坐标转换到世界空间(首先确保它们是齐次坐标;如果不是,请设置w = 1
):
V' = V * M
由于您正在同时维护这些转换,因此您实际上不再需要维护OpenGL模型视图矩阵。您可以将您的模型矩阵作为uniform传递给着色器。您可以以类似的方式维护自己的视图和投影矩阵。这在最近的OpenGL版本中是必需的;所有矩阵处理函数都已过时。
C' = P * V * M * C
,但是在最后你又说 V' = M * V
。我有点困惑,因为一次是 V * M
,一次是 M * V
。矩阵乘法不满足交换律,所以 A * B != B * A
。你的答案中可能有一个顺序是错误的吗?也许我的数学有问题,如果是这样,请随时纠正我。 - Mecki