如何在SceneKit中使用OBJ文件或CTM文件代替DAE文件?

4

我曾在IOS上使用OpenGL和Metal渲染3D场景,使用的文件格式是OBJ和CTM。现在我正在尝试使用SceneKit。似乎只能加载DAE文件。我在互联网上找到的所有演示都使用DAE文件,并且我无法在他们的代码中看到顶点和面的数组。 我怎样才能加载OBJ文件或CTM文件而不是DAE文件?

5个回答

6

加载OBJ文件

只需要将一个有效的URL传递给MDLAsset即可。

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文件。

4
你可以通过编写自己的导入器来实现。查看 SCNGeometrySCNGeometrySourceSCNGeometryElement
编辑:从 iOS 9.0 和 OS X 10.11 开始,SceneKit 可以打开 OBJ 文件或任何 Model I/O 支持的其他文件格式。你可以使用先前存在的 API(例如 +sceneNamed:)或新的 +sceneWithMDLAsset: 方法来实现。

如何从SCNGeometryElement导出所有网格? - user2724028
这个答案需要更新以适应iOS 9 / OS X 10.11。 - rickster

2

编辑:ModelIO现在可能可以加载OBJ文件。我自己没有尝试过这条路。这篇答案是在iOS 9和OS X 10.11之前编写的:

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

如果您想将OBJ转换为DAE,可以在OS X上编写一个简单的导入/导出程序来完成此操作 - 在OS X上,SceneKit实际上会读取OBJ文件(尽管未记录但可用),并且会编写DAEs。

或者,您可以从github下载“Assimp”项目,如果您想自己尝试读取OBJ,则需要做一些工作才能将其转换为SceneKit对象。


1
现在(iOS 9+),您可以使用ModelIO在iOS上加载OBJ文件,如@halmueller的答案中所述。但正如Wil所暗示的那样,您可能不应该这样做。对于任何随应用程序一起发布的资产(甚至是通过您自己的服务器发布的附加内容),最好在Mac上使用Xcode或您自己的ModelIO / SceneKit工具进行预处理,然后发布.scn文件,在设备上加载速度更快。 - rickster
这是每个iOS开发者学习至少一点Mac开发的好理由。在Mac上,这种实用程序非常方便。 - Hal Mueller
“它实际上将DAE文件预编译为iOS设备的内部格式” —— 看起来,“内部格式”只是“.scn”格式。DAE可以通过let scene = SCNScene(named: "some_3d_model.dae")在iOS上加载(已在Xcode 8中针对iOS 10.0.1进行了检查)。 - Slipp D. Thompson
2
深入研究了一下。iOS编译的....app/some_3d_model.dae是一个二进制plist,其中包含一个名为zippedData的条目和一堆ZIP压缩数据,如果进行base64解码和解压缩,则会生成一个单一的contents文件。该contents文件是一个二进制plist,看起来像是SceneKit内部场景表示 - 有许多键与SceneKit API一一对应,如geometryElementsgeometrySourceSCNMaterial属性名称和一个具有attributesnodeTreestartTime等的scene,就像SCNScene/MDLAsset一样。 (真正的.dae是一个以<COLLADA>为根的XML文件。) - Slipp D. Thompson

2

2
以下是关于支持的文件格式的更多信息:
SceneKit支持以下3D文件格式,并且可以使用Xcode中的场景编辑器将它们导入到.scn文件中:
DAE、OBJ、Alembic、STL和PLY文件。
来源:WWDC 2015 Session "Enhancements to SceneKit",02:24。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接