使用光线投射时如何为所有模型的部分重新着色?

How to recolor all model's parts when using raycasting?

我的 arView 中有一个来自 Reality Composer 的 fanfare.reality 模型。我通过 entity(at:location) 进行光线投射并启用命中对象的 ModelDebugOptionsComponent(visualizationMode: .lightingDiffuse),这使对象的外观变成灰色。但是我发现只有fanfare本身变成了灰色,而fanfare上面的flag根本没有变化。

我通过 LoadAsync() 加载 fanfare.reality 并按如下方式打印返回值。原因是旗帜、星号和号角本身被分成了3ModelEntity。在 RealityKit 中,光线投射搜索具有 CollisionComponent 的实体。只能添加到具有 ModelComponent 的实体。

因此,我的问题是当我点击屏幕上的模型(通过光线投射)时如何将整个实景模型变为灰色(fanfare+flag+star)。

分离部件模型方法

您可以轻松检索所有 3 个模型。但是你必须指定整个长层次路径:

let scene = try! Experience.loadFanfare()

// Fanfare – .children[0].children[0]
let fanfare = scene.children[0] ..... children[0].children[0] as! ModelEntity
fanfare.model?.materials[0] = UnlitMaterial(color: .darkGray)
    
// Flag – .children[1].children[0]
let flag = scene.children[0] ..... children[1].children[0] as! ModelEntity
flag.model?.materials[0] = UnlitMaterial(color: .darkGray)

// Star – .children[2].children[0]
let star = scene.children[0] ..... children[2].children[0] as! ModelEntity
star.model?.materials[0] = UnlitMaterial(color: .darkGray)

.rcproject.reality.usdz 文件中检索模型实体时,我没有发现太大差异。根据打印图,所有三个模型实体都位于同一层级,它们是同一实体的后代。 if statement 中的条件可以设置为最简单的形式——如果光线射中 fanfare 或 (||) flag 或 (||) star, 那么三个模型都要重新上色

单一模型方法

通过光线投射与 3D 模型交互的最佳解决方案是单模型方法。单一模型是一个实体 3D 对象,没有单独的部分——所有部分都组合成一个完整的模型。单模型的纹理在 UV 编辑器中总是 。可以在 Maya 或 Blender 等 3D 创作应用程序中制作单一模型。


P.S.

所有经验丰富的 AR 开发人员都知道 哇! AR 体验 与代码无关,而是与 3D 内容有关。您明白,如果您的 3D 模型由许多部分组成,则没有“灵丹妙药”可以轻松解决问题。 使用代码.

成功制作 AR 模型的成功率为 75%