2

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

Xcode 中显示的 3D usdz 模型

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

在实际应用中应用 OcclusionMaterial

示例我如何尝试使用 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 模型的某些部分?或者我是否必须使用多个模型,例如当我想更改填充时,我必须更改整个模型?或者我应该以某种方式从多个模型中合成一个对象(例如填充和其余的围栏)?感谢您的任何建议。

4

1 回答 1

1

最健壮的方法是创建一个组件 USDZ 模型(包含单独的部分),然后使用.isEnabledRealityKit 中的实例属性来转动任何部分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)
    }
}

在此处输入图像描述

于 2021-07-16T14:59:28.237 回答