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

时间:2016-10-14 08:54:22

标签: ios swift 3d swift3 scenekit

从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

如何处理这个?

2 个答案:

答案 0 :(得分:4)

我认为您的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应用程序中嵌入静态文件,那么这就是让您的模型进入的方法。但是如果您需要动态加载的模型,它就无法工作。

答案 1 :(得分:0)

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

通过转到文件->新建->文件,然后从列表中选择“ SceneKit目录”,创建一个Scenekit模型目录。

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)