You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在BodyEntity中以编程方式访问cull mode和double sided属性

可以通过BodyEntity以编程方式修改这两个属性,且修改后不会被自动重置,具体实现逻辑如下:

配置失效原因

直接在Scene Graph中修改属性失效的原因是:编辑器中对USDZ内嵌模型属性的修改属于临时预览配置,USDZ资源加载到运行时环境时会自动读取自身内嵌的材质默认配置,覆盖编辑器侧的临时设置。

具体实现步骤

  • 加载完成BodyEntity后,遍历其所有子实体,筛选出包含ModelComponent的节点,3D模型的网格、材质属性都存储在该组件中
  • 遍历ModelComponent下的所有材质实例,按需修改双面渲染和剔除模式配置:
    • 双面渲染对应属性为isDoubleSided,设为true即可开启双面渲染
    • 剔除模式对应属性为cullMode,可选值包括.back(剔除背面,默认值)、.front(剔除正面)、.none(不剔除)
  • 由于RealityKit的组件为值类型,修改完成后需要将调整后的ModelComponent重新赋值给对应实体,修改才会生效

代码示例

import RealityKit
import ARKit

// 加载USDZ角色为BodyEntity
guard let bodyEntity = try? BodyEntity(named: "your_model.usdz") else { return }

// 遍历所有子实体修改属性
bodyEntity.forEachChild { child in
    guard var modelComponent = child.components[ModelComponent.self] else { return }
    
    // 遍历所有材质修改属性
    modelComponent.materials = modelComponent.materials.map { material in
        guard var pbrMaterial = material as? PhysicallyBasedMaterial else { return material }
        // 开启双面渲染
        pbrMaterial.isDoubleSided = true
        // 设置剔除模式为不剔除
        pbrMaterial.cullMode = .none
        return pbrMaterial
    }
    
    // 重新赋值修改后的组件
    child.components[ModelComponent.self] = modelComponent
}

// 将调整后的实体添加到场景
arView.scene.addAnchor(bodyEntity)

如果你的角色使用的是SimpleMaterial而非PBR材质,只需把上述代码中的PhysicallyBasedMaterial替换为SimpleMaterial即可,两个材质类都包含isDoubleSided和cullMode属性。你截图中场景编辑器里的Cull Mode和Double Sided设置项,和上述代码中修改的属性完全对应,通过代码修改后运行时不会被重置。

设置项

内容的提问来源于stack exchange,提问作者Mochi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 18:30:02