在iOS上的SceneKit中导入3d模型



我在从URL导入。obj文件并将其转换为SCNNode时遇到问题

下面是代码(swift3):
    let url = URL.init(string: "https://cloud.box.com/shared/static/ock9d81kakj91dz1x4ea.obj")
    let asset = MDLAsset(url: url! as URL)
    let object = asset.object(at: 0)
    let node = SCNNode(mdlObject: object)

但是当我运行项目时,控制台显示:

Could not open OBJ file

如何处理?

我认为你的OBJ文件超过了一些内部iOS限制。请在https://bugreport.apple.com上提交报告。

这个稍微修改的代码版本在macOS playground (Xcode 8.0)中完美地工作。但在iOS游戏中,我在控制台看到同样的"无法打开OBJ文件"。

import SceneKit
import ModelIO
import SceneKit.ModelIO
if let url = URL.init(string: "https://cloud.box.com/shared/static/ock9d81kakj91dz1x4ea.obj") {
    let asset = MDLAsset(url: url)
    print(asset)
    let object = asset.object(at: 0)
    print(object)
    let node = SCNNode.init(mdlObject: object)
    print(node)
}

我可以用Xcode下载并打开OBJ文件。然后在场景编辑器中,我将其转换为SCN格式。这给了我一个。scn文件,可以嵌入到iOS项目中,并使用SCNScene打开(就像著名的旋转宇宙飞船)。如果你能在iOS应用中嵌入一个静态文件,这是一种引入模型的方式。但是如果你需要动态加载的模型,它将无法工作。

顺便说一下,如果您在本地拥有obj文件,您可以直接使用:

guard let url = Bundle.main.url(forResource: "ock9d81kakj91dz1x4ea", withExtension: "obj") else { return nil }
    let asset = MDLAsset(url: url)
    let object = asset.object(at: 0)
    let node = SCNNode(mdlObject: object)

这应该可以让你在swift 4.2/xcode 10.2+中加载obj/dae文件:

创建一个scenekit模型目录,点击File -> New -> File,从列表中选择"scenekit catalog"。

import SceneKit.ModelIO

:

guard let url = Bundle.main.url(
 forResource: "your_obj_filename",
 withExtension: "obj",
 subdirectory: "your_folder.scnassets") 
     else { fatalError("Failed to find model file.") }
let asset = MDLAsset(url:url)
guard let object = asset.object(at: 0) as? MDLMesh 
     else { fatalError("Failed to get mesh from asset.") }
let newNode  = SCNNode(mdlObject: object)

最新更新