无法将3D模型作为SCNGeometry馈入MDLMesh容器

时间:2018-10-14 21:43:17

标签: swift scenekit augmented-reality arkit ios12

我正在创建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)

enter image description here

  

但是编译器给我一个错误:

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

问题是 :我应该使用哪种方法将 "Helicopter.usdz" 几何分配给 {{1 }} 不变?

请帮助我找到解决方法!

您可以下载helicopterGeo文件以测试HERE

3 个答案:

答案 0 :(得分:1)

这应该有效:

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文件。然后,您可以从rootNode的{​​{1}}的子节点获取几何。

scene

编辑

使用AR Quick Look Gallery中的一个文件,我设法使此代码起作用。我遇到的主要问题是特定子节点的名称,有一个名为“ RetroTV”的节点,但没有附加任何几何图形,它只是“ RetroTVBody”和“ RetroTVScreen”的父节点。唯一的问题是它没有为几何图形加载纹理。

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

以上代码也可用于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!") } 语句之外的tvNodegeometry声明。

答案 1 :(得分:1)

我没有确切的答案,但是在您遇到的情况下,我将要做的是检查refNode的层次结构。

在加载后放置一个断点,并使用调试器查看它是否有子代。那些孩子有几何形状吗?他们有没有带几何的孩子?

创建3D资产时,有时会将多个部分分组到一个父节点上,并且在许多情况下,该父节点为空。

答案 2 :(得分:0)

是Maya二进制文件中的错误,还是SELECT t1.total_amount :: float AS amount, t1.status :: TEXT FROM accounting.payment_in_records AS t1 UNION ALL SELECT t1.fees :: float AS amount, 'Processed' :: TEXT AS status FROM accounting.payment_out_record_detail_groups AS t1 WHERE t1.fees > 0; 转换中的错误–我不清楚。 Xcode在最简单的usdz层次结构中看不到对象的正确名称:代替Scene graph,它只是显示pHelicopter1。我的3D对象是由Helicopter使用多边形pCube1工具制成的。

这是最终代码,它可以正常工作:

Extrude

enter image description here