Как создать SCNNode из .usdz?

Я загрузил модели .usdz, предоставленные Apple: 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 в папку в каталоге моего проекта, как вы можете видеть:

введите описание изображения здесь


person Sergio    schedule 15.11.2018    source источник


Ответы (3)


Правильный способ добавить объект .USDZ - это фактически создать сцену с URL-адресом файла:

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

Или даже создание через эталонный узел:

 let referenceNode = SCNReferenceNode(url: usdzURL)
 referenceNode.load()
person Flavio Bittencourt    schedule 20.11.2018

Можно загрузить usdz в сцену ARKit.

Важно, чтобы этот импорт

import ARKit
import SceneKit
import SceneKit.ModelIO

Загрузите usdz через URL-адрес.

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. Вам нужно будет масштабировать и ориентировать объект там, где вы хотите, в реальном мире, но этот код зависит от того, что вы пытаетесь сделать, поэтому я пропустил это.

person skymook    schedule 30.03.2021

Правильный способ доступа к внутреннему узлу 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
}

Другая не отображаемая текстура - это другое Проблема, которую можно решить, добавив молнию в среду.

person Kaustubh Patil    schedule 30.03.2021