【问题标题】:Converting DirectX vertexes to OpenGL vertexes将 DirectX 顶点转换为 OpenGL 顶点
【发布时间】:2013-05-16 18:22:03
【问题描述】:

我有一个包含完整顶点数据的文件,该文件是从使用 DirectX 的软件导出的。现在我想用它在 Ogre 中创建一个网格。自从我在 Mac 上使用 Xcode 开发以来,我将 Ogre 设置为使用 OpenGL。

我的问题是如何将这些顶点转换为与 OpenGL 兼容?

例如,如果我有一个这种格式的 DirectX 顶点: DirectXVertex 顶点DX = {x, y, z} 在 OpenGL 顶点中会是什么样子: OpenGLVertex 顶点GL = ?

此外,在文件中,我有三角形面的数据,其索引指向正确的顶点。它们是否也必须以某种方式进行转换,还是只需要更改顶点?

【问题讨论】:

    标签: opengl directx ogre


    【解决方案1】:

    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);
    

    【讨论】:

    • 感谢您的回答。就一个问题“翻转三角形顶点的顺序”是指翻转顶点的顺序({x,y,z}=>{x,z,y})还是翻转三角形的面顺序?跨度>
    • @Silex - 翻转三角形面的顺序
    • 是的,我也是这么想的,谢谢你的帮助和详细的回答!