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

Posted

技术标签:

【中文标题】RealityKit - 隐藏和显示 usdz 模型的部分(网格)【英文标题】:RealityKit - Hiding and showing parts (meshes) of usdz model 【发布时间】:2021-09-25 00:03:09 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

最稳健的方法是创建一个组件 USDZ 模型(包含单独的部分),然后使用 RealityKit 中的.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)
    

【讨论】:

这正是我想要的。您是如何创建该组件 USDZ 文件的?它是来自设计工具并以 .usdz 格式导出的吗?因为当我加载我的 usdz 文件时,它应该有不同的网格(我在 Xcode 中的资产预览中看到它)但是在运行我的实体时没有子实体。 理想情况下,您必须是 USDZ 模型的作者。但是,如果您使用来自库或网络资源的 USDZ 模型,则很少可能使用“单独的部分方法”。很多时候,USDZ 内容的创建者将网格组合成一个组(复合组),因此您将无法在这样的模型中使用单独的部分。 但是,如果您已经获得了复合 USDZ 模型,则可以在安装了 USD 插件的 Maya 2022 中分离其组合网格。 knowledge.autodesk.com/support/maya/learn-explore/caas/… 我不是 USDZ 的作者,但它是由设计师定制的。他给了我包含材料的 .obj 文件,我尝试使用 Blender (github.com/robmcrosby/BlenderUSDZ) 将其导出。你知道如何在 Blender 中设置分离的网格吗? 我知道如何在 Maya 中分离表面。

以上是关于RealityKit - 隐藏和显示 usdz 模型的部分(网格)的主要内容,如果未能解决你的问题,请参考以下文章

如何在realitykit中显示来自画廊的图像?

有没有办法在 RealityKit 中将视图呈现为实体?

高质量渲染——RealityKit vs SceneKit vs Metal

从搅拌机导出的 USDZ 模型损坏

如何创建 .usdz 动画?

如何添加/乘以 USDZ 格式的纹理?