8

我已经下载了 Apple 提供的 .usdz 模型:https ://developer.apple.com/arkit/gallery/

但是现在,我想用这些模型之一创建一个 SCNNode,所以我这样做是为了获取节点:

guard let urlPath = Bundle.main.url(forResource: "retrotv", withExtension: "usdz") else {
    return
}
let mdlAsset = MDLAsset(url: urlPath)
let modelRootNode = SCNScene(mdlAsset: mdlAsset).rootNode

然后我将它添加到场景中,结果是这样的:

在此处输入图像描述

为什么没有纹理?

如您所见,我已将下载的 .usdz 文件放入项目目录中的文件夹中:

在此处输入图像描述

4

3 回答 3

14

添加 .USDZ 对象的正确方法实际上是使用文件的 URL 创建场景:

 let scene = try! SCNScene(url: usdzURL, options: [.checkConsistency: true])

甚至通过参考节点创建:

 let referenceNode = SCNReferenceNode(url: usdzURL)
 referenceNode.load()
于 2018-11-20T16:27:27.110 回答
2

可以将 usdz 加载到 ARKit 场景中。

拥有这些进口很重要

import ARKit
import SceneKit
import SceneKit.ModelIO

通过 URL 加载 usdz。

guard let urlPath = Bundle.main.url(forResource: "retrotv", withExtension: "usdz") else {
    return
}
let mdlAsset = MDLAsset(url: urlPath)
// you can load the textures on an MDAsset so it's not white
mdlAsset.loadTextures()

将其包装在一个节点中。

let asset = mdlAsset.object(at: 0) // extract first object
let assetNode = SCNNode(mdlObject: asset)

您现在可以在 ARKit 中附加此节点。您需要缩放对象并将其定向到您在现实世界中想要的位置,但是该代码取决于您要执行的操作,因此我将其省略了。

于 2021-03-30T09:54:57.663 回答
0

访问内部 USDZ 节点的正确方法

func usdzNodeFrom(file: String, exten: String, internal_node: String) -> SCNNode? {
    let rootNode = SCNNode()
    let scale = 1

    guard let fileUrl = Bundle.main.url(forResource: file, withExtension: exten) else {
        fatalError()
    }
    
    let scene = try! SCNScene(url: fileUrl, options: [.checkConsistency: true])
    let node = scene.rootNode.childNode(withName: internal_node, recursively: true)!
    node.name = internal_node
    let height = node.boundingBox.max.y - node.boundingBox.min.y
    node.position = SCNVector3(0, 0, 0)
    tNode.scale = SCNVector3(scale, scale, scale)
    rootNode.addChildNode(tNode)
    return rootNode
}

进一步的纹理不显示是不同的问题,可以通过向环境添加闪电来解决。

于 2021-03-30T11:53:33.977 回答