代码之家  ›  专栏  ›  技术社区  ›  Andy Jazz

无法将三维模型作为SCN度量输入MDLMesh容器

  •  3
  • Andy Jazz  · 技术社区  · 6 年前

    我想装货 USDZ 将三维对象转换为 空的 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)
    


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

    问题是 :我应该使用什么方法来分配 "Helicopter.usdz" helicopterGeo 常数?

    请帮我找个解决办法!

    你可以下载 美元 HERE .

    3 回复  |  直到 5 年前
        1
  •  1
  •   Brandon    6 年前

    这应该起作用:

    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 scene .

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

    AR Quick Look Gallery

    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!")
    
    }
    

    上面的代码也适用于 tvNode geometry 境外申报 if let 声明。

        2
  •  1
  •   EmilioPelaez    6 年前

    refNode .

    加载后放置一个断点,并使用调试器查看它是否有任何子级。那些孩子有几何学吗?他们有学几何的孩子吗?

    创建三维资源时,有时会在父节点上对多个节进行分组,在许多情况下,父节点为空。

        3
  •  1
  •   Andy Jazz    6 年前

    usdz Scene graph pHelicopter1 它刚刚显现出来 Helicopter pCube1 Extrude 工具。

    以下是最终代码,它运行良好:

    import ARKit
    import SceneKit.ModelIO
    
    //..........................................................
    
    var 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 mdlAsset = MDLAsset(url: refURL)
        scene = SCNScene(mdlAsset: mdlAsset)
        let helicopterNode = scene.rootNode.childNode(withName: "pHelicopter1", 
                                                   recursively: true)
    
        let geometry = helicopterNode!.geometry!
        let mdlMesh = MDLMesh(scnGeometry: geometry)
        try! mdlMesh.makeVerticesUniqueAndReturnError()
        let flattenedGeometry = SCNGeometry(mdlMesh: mdlMesh)
        let flattenedNode = SCNNode(geometry: flattenedGeometry)
        scene.rootNode.addChildNode(flattenedNode)
    
    } else {
        print("Invalid path!")
    }
    

    enter image description here

    推荐文章