#ios #swift #augmented-reality #realitykit #usdz
Вопрос:
Мне нужен совет. Я использую RealityKit для показа моделей ограждений. У меня есть модели, в которых есть несколько сеток, которые не должны отображаться одновременно. Например, заполнение забора. Есть разные варианты, и у меня все это есть в моей модели:
Я хотел бы показывать всегда по одному в то время. Как я могу это сделать? Я не могу редактировать сетки во время выполнения, не так ли? Я думал об изменении материала для каждой сетки, но когда я попытался установить чистый цвет с помощью 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. Я знаю, как разделять поверхности в Майя.