ARG*_*Geo 5 augmented-reality scenekit swift arkit ios12
我正在创建 AR 应用程序(Xcode 10.1,Swift 4.2.1)。
我想将USDZ3D 对象加载到空SceneKit 的场景中,然后将其作为MDL网格进行处理。
这是我的代码:
import ARKit
import SceneKit.ModelIO
let scene = SCNScene(named: "art.scnassets/emptyScene.scn")!
if let filePath = Bundle.main.path(forResource: "Helicopter",
ofType: "usdz",
inDirectory: "art.scnassets") {
let refURL = URL(fileURLWithPath: filePath)
let refNode = SCNReferenceNode(url: refURL)
refNode?.load()
scene.rootNode.addChildNode(refNode!)
}
let helicopterGeo = refNode!.geometry
let mdlMesh = MDLMesh(scnGeometry: helicopterGeo!) // ERROR APPEARS HERE
try! mdlMesh.makeVerticesUniqueAndReturnError()
let flattenedGeometry = SCNGeometry(mdlMesh: mdlMesh)
let flattenedNode = SCNNode(geometry: flattenedGeometry)
scene.rootNode.addChildNode(flattenedNode)
Run Code Online (Sandbox Code Playgroud)
但是编译器给了我一个错误:
"Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value"
Run Code Online (Sandbox Code Playgroud)
问题是:我应该使用什么方法将"Helicopter.usdz"几何体分配给helicopterGeo常量?
请帮我找到解决方法!
您可以USDZ在此处下载用于测试的文件。
这应该有效:
var scene: SCNScene!
if let filePath = Bundle.main.path(forResource: "Helicopter",
ofType: "usdz",
inDirectory: "art.scnassets") {
let refURL = URL(fileURLWithPath: filePath)
let mdlAsset = MDLAsset(url: refURL)
scene = SCNScene(mdlAsset: mdlAsset)
}
Run Code Online (Sandbox Code Playgroud)
SCNReferenceNode仅适用于 .scn 文件。rootNode然后,您可以从的子节点获取几何图形scene。
let helicopterNode = scene.rootNode.childNode(withName: "helicopter", recursively: true)
let geometry = helicopterNode.geometry!
Run Code Online (Sandbox Code Playgroud)
使用AR Quick Look Gallery中的一个文件,我设法让这段代码正常工作。我遇到的主要问题是特定子节点的名称,有一个名为“RetroTV”,但它没有附加任何几何图形,它只是“RetroTVBody”和“RetroTVScreen”的父节点。唯一的问题是它没有加载几何体的纹理。
var scene: SCNScene!
if let filePath = Bundle.main.path(forResource: "retrotv",
ofType: "usdz",
inDirectory: "art.scnassets") {
let refURL = URL(fileURLWithPath: filePath)
let mdlAsset = MDLAsset(url: refURL)
scene = SCNScene(mdlAsset: mdlAsset)
let tvNode = scene.rootNode.childNode(withName: "RetroTVBody", recursively: true)
let geometry = tvNode!.geometry!
} else {
print("invalid path!")
}
Run Code Online (Sandbox Code Playgroud)
上面的代码也适用于语句外部的tvNodeand声明。geometryif let
| 归档时间: |
|
| 查看次数: |
1535 次 |
| 最近记录: |