使用光线投射时如何为所有模型的部分重新着色?
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%
我的 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 编辑器中总是
P.S.
所有经验丰富的 AR 开发人员都知道 哇! AR 体验 与代码无关,而是与 3D 内容有关。您明白,如果您的 3D 模型由许多部分组成,则没有“灵丹妙药”可以轻松解决问题。 使用代码.
成功制作 AR 模型的成功率为 75%