如何在 SceneKit 中使用 OBJ 文件或 CTM 文件而不是 DAE 文件?

How can I use OBJ file or CTM file instead of DAE file in SceneKit?

我曾经在IOS上用openGL和metal渲染3d场景,我使用的文件格式是OBJ和CTM。这些天我正在尝试 Scene Kit。似乎 SceneKit 只加载 DAE 文件。我在网上能找到的所有demo都是用DAE文件,在他们的代码中看不到顶点和面的数组。 如何加载 OBJ 文件或 CTM 文件而不是 DAE 文件?

您可以通过编写自己的导入程序来做到这一点。看看 SCNGeometrySCNGeometrySourceSCNGeometryElement.

编辑: 开始 iOS 9.0 和 OS X 10.11 SceneKit 可以打开 OBJ 文件或模型 I/O 支持的任何其他文件格式.您可以使用以前存在的 API(例如 +sceneNamed:)或新的 +sceneWithMDLAsset: 方法来执行此操作。

编辑:ModelIO 现在可能可以加载 OBJ 文件。我自己还没有尝试过这条路。这个答案写在iOS 9 and OS X 10.11:

之前

SceneKit 无法在 iOS 上加载 DAE 文件,实际上,它实际上将 DAE 文件预编译为 iOS 设备的内部格式。

如果你想将你的 OBJ 转换为 DAE,你可以在 OS X 上写一个简单的 importer/exporter 来实现——在 OS X 上 SceneKit 将实际读取 OBJ 文件(它是没有记录但它有效)并将编写 DAE。

或者,如果您想尝试自己阅读 OBJ,您可以在 github 下载 "Assimp" 项目,但是将它放入 SceneKit 对象中需要一些工作。

从 iOS 9/OS X 10.11 开始,您可以使用模型 I/O 的 MDLAsset 导入 OBJ 文件(以及一些其他格式)。 有示例代码。

正在加载 OBJ 文件

就像传递一个有效的 MDLAsset 一样简单 URL。

private func nodeForURL(url: NSURL) -> SCNNode
{
    let asset = MDLAsset(URL: url)
    let object = asset.objectAtIndex(0)
    let node = SCNNode(MDLObject: object)

    return node
}

这不仅会正确加载 .obj 文件,还会加载引用的 .mtl 文件。

有关支持的文件格式的更多信息:

SceneKit 支持以下 3D 文件格式,可以使用 Xcode 中的场景编辑器导入到 .scn 文件:

DAE, OBJ, Alembic, STL and PLY files.

来源:WWDC 2015 Session "Enhancements to SceneKit" 在 02:24