我曾在IOS上使用OpenGL和Metal渲染3D场景,使用的文件格式是OBJ和CTM。现在我正在尝试使用SceneKit。似乎只能加载DAE文件。我在互联网上找到的所有演示都使用DAE文件,并且我无法在他们的代码中看到顶点和面的数组。 我怎样才能加载OBJ文件或CTM文件而不是DAE文件?
只需要将一个有效的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
文件。SCNGeometry
、SCNGeometrySource
和 SCNGeometryElement
。+sceneNamed:
)或新的 +sceneWithMDLAsset:
方法来实现。编辑: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对象。
.scn
文件,在设备上加载速度更快。 - ricksterlet scene = SCNScene(named: "some_3d_model.dae")
在iOS上加载(已在Xcode 8中针对iOS 10.0.1进行了检查)。 - Slipp D. Thompson....app/some_3d_model.dae
是一个二进制plist,其中包含一个名为zippedData
的条目和一堆ZIP压缩数据,如果进行base64解码和解压缩,则会生成一个单一的contents
文件。该contents
文件是一个二进制plist,看起来像是SceneKit内部场景表示 - 有许多键与SceneKit API一一对应,如geometryElements
、geometrySource
、SCNMaterial
属性名称和一个具有attributes
、nodeTree
、startTime
等的scene
,就像SCNScene/MDLAsset
一样。 (真正的.dae
是一个以<COLLADA>
为根的XML文件。) - Slipp D. Thompson从iOS 9/OS X 10.11开始,您可以使用Model I/O的MDLAsset
导入OBJ文件(以及其他几种格式)。 如何使用Model I/O将Wavefront OBJ文件转换为SCNNode中有示例代码。
.scn
文件中: