【问题标题】:How to import a .obj file in DirectX 11如何在 DirectX 11 中导入 .obj 文件
【发布时间】:2014-10-28 01:18:39
【问题描述】:

目前正在尝试将我的 3D 建模 ship.obj 文件导入到我的 DirectX11 游戏中。我对此有两个问题。

首先,有没有简单的库(有很好的文档)可以为初学者导入DirectX 11 中的.obj

第二,如何导入和渲染他们的模型?

【问题讨论】:

    标签: c++ visual-studio-2013 directx


    【解决方案1】:

    使用 VS 2012 和 VS 2013,内容管道可以将 Wavefront OBJ 文件导出为 CMO。 DirectXMesh 库包含一个命令行工具 Meshconvert,它将加载 Wavefront OBJ 文件并将它们导出为 CMO 或 SDKMESH 文件。

    DirectX Tool Kit 的模型类可以从 CMO 或 SDKMESH 文件加载和渲染。

    DirectX 工具包: http://go.microsoft.com/fwlink/?LinkId=248929

    DirectXMesh: http://go.microsoft.com/fwlink/?LinkID=324981

    DirectXMesh Utilities 文件夹中还有一个 WaveFrontReader 类,您可以将其用作将 Wavefront OBJ 文件解析为 VB 和 IB 的示例。

    【讨论】:

      【解决方案2】:

      一个obj文件通常有以下格式:

      v <numbers>
      etc..
      
      vt <numbers>
      etc..
      
      vn <numbers>
      etc..
      
      f <numbers>
      etc..
      

      其中 v 是位置数据; vt 纹理法线; vn 位置法线; face 将是其索引。因此,您必须根据第一个字母读取每个值并将它们放置在正确的容器中(我推荐使用向量,因为它们易于使用)。您不必将索引的所有值放入向量中,因为索引只是指向某种类型的某个顶点的数字。通常,可以肯定的是,“f”行应该具有以下格式的值:

      f v/vt/vn v/vt/vn v/vt/vn 假设模型是三角剖分的。这表示每个三角形的三个位置顶点,否则它们构成了整个模型。如果您的模型没有进行三角剖分,那么您将有 4 组值,每组值都指向每个组中的一个值。

      此时您需要根据“f”行中指向的索引对位置顶点、法线和纹理法线进行排序。一些伪代码:

      for (int i = 0; i < indices; i++)
      {
          orderedPositions.push_back(unOrderedPositions[positionIndex[indices] * # of indices + k]);
          // Same applies to normals and textures
      }
      
      // Where k is the group number of the face from 1 to n depending on how many groups of faces there are per line.
      

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2020-05-12
        • 2020-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-12
        相关资源
        最近更新 更多