RealityKit — Скрытие и отображение частей (сеток) модели usdz

#ios #swift #augmented-reality #realitykit #usdz

Вопрос:

Мне нужен совет. Я использую RealityKit для показа моделей ограждений. У меня есть модели, в которых есть несколько сеток, которые не должны отображаться одновременно. Например, заполнение забора. Есть разные варианты, и у меня все это есть в моей модели:

3D модель usdz, показанная в Xcode

Я хотел бы показывать всегда по одному в то время. Как я могу это сделать? Я не могу редактировать сетки во время выполнения, не так ли? Я думал об изменении материала для каждой сетки, но когда я попытался установить чистый цвет с помощью SimpleMaterial, он показывает сетку черным, и когда я попробовал OcclusionMateril, я получил этот результат:

Примените окклюзионный материал в реальном приложении

Пример того, как я пытался скрыть материал с помощью SimpleMaterial:

 var material = SimpleMaterial()
material.baseColor = MaterialColorParameter.color(UIColor.clear)
material.tintColor = .clear
clonedEntity.model?.materials[index] = material
 

Или с окклюзионным материалом (на скриншоте из приложения выше):

 let occlusion = OcclusionMaterial()
clonedEntity.model?.materials[index] = occlusion
 

Можно ли как-то скрыть части 3D-модели? Или мне нужно несколько моделей, и когда я хочу, например, изменить заполнение, я должен изменить всю модель? Или я должен каким-то образом составить один объект из нескольких моделей (например, заполнение и остальная часть забора)? Спасибо за любой совет.

Ответ №1:

Наиболее надежный способ-создать компонентную модель USDZ (содержащую отдельные части), а затем использовать .isEnabled свойство экземпляра в RealityKit для поворота любой детали On или Off .

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

 import UIKit
import RealityKit

class ViewController: UIViewController {
    
    @IBOutlet var arView: ARView!
    let shelf = try! ModelEntity.load(named: "Shelf")
    var counter: Int = 0

    override func touchesBegan(_ touches: Set<UITouch>, 
                              with event: UIEvent?) {
        self.counter  = 1

        let metal = shelf.children[0].children[0].children[0]
                         .children[0].children[0].children[0] as! ModelEntity
        let wood = shelf.children[0].children[0].children[0]
                        .children[0].children[0].children[1] as! ModelEntity

        if counter % 3 == 1 {
            metal.isEnabled = false
            wood.isEnabled = true
        } else if counter % 3 == 2 {
            metal.isEnabled = true
            wood.isEnabled = false
        } else if counter % 3 == 0 {
            metal.isEnabled = true
            wood.isEnabled = true
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let anchor = AnchorEntity()
        anchor.addChild(shelf)
        arView.scene.anchors.append(anchor)
    }
}
 

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

Комментарии:

1. Это именно то, что я искал. Как именно вы создали файл USDZ этого компонента? Это из инструмента проектирования и экспортируется в .usdz? Потому что, когда я загружаю свой файл usdz, он должен иметь разные сетки (я вижу это в Xcode в предварительном просмотре активов), но при запуске у моей сущности нет дочерних элементов.

2. В идеале вы должны быть автором моделей USDZ. Но «подход по отдельным частям» редко возможен, если вы используете модели USDZ из библиотек или веб-ресурсов. Очень часто создатели контента USDZ объединяют сетки в одну группу (составную группу), поэтому вы не сможете использовать отдельные части в такой модели.

3. Однако, если у вас уже есть составная модель USDZ, вы можете разделить ее комбинированную сетку в Мае 2022 года с установленным плагином USD. knowledge.autodesk.com/support/maya/learn-explore/caas/…

4. Я не являюсь автором USDZ, но он создан по заказу дизайнера. Он дал мне файл .obj с материалами, и я пытаюсь экспортировать его с помощью блендера ( github.com/robmcrosby/BlenderUSDZ ). Вы знаете, как я могу установить разделенные сетки в блендере?

5. Я знаю, как разделять поверхности в Майя.