gpt4 book ai didi

swift - 无法将 3D 模型作为 SCNGeometry 提供给 MDLMesh 容器

转载 作者:搜寻专家 更新时间:2023-10-31 22:38:18 25 4
gpt4 key购买 nike

我正在创建 AR 应用程序(Xcode 10.1、Swift 4.2.1)。

我想将 USDZ 3D 对象加载到一个 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)


But compiler gives me an error:

"Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value"

问题是:我应该使用什么方法来分配一个"Helicopter.usdz"几何图形到helicopterGeo 常量?

请帮我找到解决方法!

您可以下载USDZ文件进行测试HERE .

最佳答案

这应该有效:

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)

}

SCNReferenceNode 仅适用于 .scn 文件。然后,您可以从 scenerootNode 的子节点获取几何体。

let helicopterNode = scene.rootNode.childNode(withName: "helicopter", recursively: true)
let geometry = helicopterNode.geometry!

编辑

使用来自 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!")

}

上述代码也适用于 if let 语句之外的 tvNodegeometry 声明。

关于swift - 无法将 3D 模型作为 SCNGeometry 提供给 MDLMesh 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52807356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com