我有一个包含顶点数据的文件,该文件是从使用DirectX的软件导出的。现在我想在Ogre中创建一个网格。我将Ogre设置为使用OpenGL,因为我使用Xcode在Mac上开发。
我的问题是如何将这些顶点转换为OpenGL兼容?
例如,如果我有这种格式的DirectX顶点: DirectXVertex vertexDX = {x,y,z} 它在OpenGL顶点中会是什么样子: OpenGLVertex vertexGL =?
同样在文件中我有三角形面的数据,其中索引到右顶点。它们是否必须以某种方式转换,或者只需要更改顶点?
答案 0 :(得分:2)
DirectX使用左手坐标系,而OpenGL使用右手系统。
此article on MSDN描述了在以其他方式(即从OpenGL到Directx)移植数据时需要执行的操作。要点是:
Direct3D使用左手坐标系。如果要移植基于右手坐标系的应用程序,则必须对传递给Direct3D的数据进行两处更改。
翻转三角形顶点的顺序,以便系统从前面顺时针穿过它们。换句话说,如果顶点是v0,v1,v2,则将它们作为v0,v2,v1传递给Direct3D。
使用视图矩阵在z方向上将世界空间缩放-1。为此,请翻转用于视图矩阵的D3DMATRIX结构的_31,_32,_33和_34成员的符号。
因此,如果上面的文章描述了如何将OpenGL移植到DirectX,则需要执行上述相反操作以转换其他方式。碰巧的是,上述操作的反向完全相同。
OpenGL没有像DirectX那样的单独模型和视图矩阵,因为它们被连接到模型视图矩阵中。您可以像这样模拟左手坐标系:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glScalef(1.0f, 1.0f, -1.0f);