iOS 在 SceneKit 中导入 3d 模型
import 3d model in SceneKit on iOS
从 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 游乐场 (Xcode 8.0) 中完美运行。但是在 iOS 操场上,我在控制台中看到了相同的 "Could not open OBJ file"。
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 Catalog" 来创建 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)
从 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 游乐场 (Xcode 8.0) 中完美运行。但是在 iOS 操场上,我在控制台中看到了相同的 "Could not open OBJ file"。
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 Catalog" 来创建 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)