如何在 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 文件?
您可以通过编写自己的导入程序来做到这一点。看看 SCNGeometry
、SCNGeometrySource
和 SCNGeometryElement
.
编辑: 开始 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
我曾经在IOS上用openGL和metal渲染3d场景,我使用的文件格式是OBJ和CTM。这些天我正在尝试 Scene Kit。似乎 SceneKit 只加载 DAE 文件。我在网上能找到的所有demo都是用DAE文件,在他们的代码中看不到顶点和面的数组。 如何加载 OBJ 文件或 CTM 文件而不是 DAE 文件?
您可以通过编写自己的导入程序来做到这一点。看看 SCNGeometry
、SCNGeometrySource
和 SCNGeometryElement
.
编辑: 开始 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