首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能将MDLMesh容器的三维模型输入为SCNGeometry

不能将MDLMesh容器的三维模型输入为SCNGeometry
EN

Stack Overflow用户
提问于 2018-10-14 21:43:16
回答 3查看 1.9K关注 0票数 5

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

我希望将USDZ 3D对象加载到空的SceneKit场景中,然后将其处理为MDL网格。

这是我的密码:

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
"Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value"

"Helicopter.usdz"的问题是:我应该使用什么方法将helicopterGeo几何赋值给helicopterGeo常量?

请帮我找个解决办法!

您可以下载USDZ文件来测试这里

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-15 18:20:08

这应该是可行的:

代码语言:javascript
复制
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文件。然后,您可以从rootNodescene的子节点获取几何。

代码语言:javascript
复制
let helicopterNode = scene.rootNode.childNode(withName: "helicopter", recursively: true)
let geometry = helicopterNode.geometry!

编辑

使用AR快看画廊中的一个文件,我设法使这段代码正常工作。我遇到的主要问题是特定子节点的名称,有一个名为"RetroTV“,但它没有任何几何附加,它只是"RetroTVBody”和“RetroTVScreen”的父节点。唯一的问题是,它没有加载纹理的几何。

代码语言:javascript
复制
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语句之外的geometryif let声明。

票数 2
EN

Stack Overflow用户

发布于 2018-11-15 20:28:25

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

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

在创建3D资产时,有时会在父节点上分组多个节,并且在许多情况下父节点是空的。

票数 1
EN

Stack Overflow用户

发布于 2018-11-16 12:17:14

是玛雅二进制文件中的错误,还是usdz转换的错误--我不知道。在Scene graph最简单的层次结构中,Xcode没有看到对象的正确名称:它只显示了Helicopter,而不是pHelicopter1。我的3D对象是用pCube1用多边形Extrude工具制作的。

下面是最后的代码,它运行得很好:

代码语言:javascript
复制
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!")
}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52807356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档