swift RealityKit -隐藏和显示usdz模型的部分(网格)

wfypjpf4  于 2023-05-05  发布在  Swift
关注(0)|答案(1)|浏览(235)

我需要一个建议。我正在使用RealityKit来展示围栏模型。我有几个模型,其中有几个网格,不应该显示在一次。例如,填充围栏。有不同的选择,我在我的模型中都有:

我想每次都展示一个。我该怎么做?我不能在运行时编辑网格,对吗?我正在考虑为每个网格更改材质,但当我尝试使用SimpleMaterial设置清晰颜色时,它显示黑色的网格,当我尝试OcclusionMateriel时,我得到了以下结果:

例如,我如何尝试使用SimpleMaterial隐藏材质:

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

或者使用OcclusionMaterial(在上面应用程序的屏幕截图中):

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

有没有可能以某种方式隐藏3D模型的部分?或者我必须有几个模型,当我想改变填充,例如,我必须改变整个模型?或者我应该以某种方式从多个模型中合成一个对象(例如填充和围栏的其余部分)?谢谢你的建议。

sigwle7e

sigwle7e1#

最健壮的方法是创建一个组件USDZ模型(包含单独的部件),然后使用RealityKit 2.0中的.isEnabled示例属性将任何部件转换为OnOff

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)
    }
}

如果您不喜欢使用.children[i]链接,请查看以下答案:

相关问题