RealityKit中Plane实体地面阴影闪烁:如何单独禁用指定平面阴影?
问题描述
使用带PNG纹理的UnlitMaterial材质Plane作为场景模型放置位置指示器,开启grounding shadow后,该Plane会伴随阴影闪烁、显示异常;禁用grounding shadow则恢复正常,但其他模型需要保留grounding shadow。希望实现单独禁用该Plane的grounding shadow,或解决闪烁问题。
实现代码如下:
let planeMesh = MeshResource.generatePlane(width: 0.8, depth: 0.8) let planeAnchor = AnchorEntity(plane: .horizontal) var material = UnlitMaterial(color: .white) material.color.texture = try! .init(.load(named:"indicator")) indicatorEntity = ModelEntity(mesh: planeMesh, materials: [material]) planeAnchor.addChild(indicatorEntity) arView.scene.addAnchor(planeAnchor)
func session(_ session: ARSession, didUpdate frame: ARFrame) { guard let result = self.arView.raycast(from: arView.center, allowing: .estimatedPlane, alignment: .horizontal).first else { return } indicatorEntity.setTransformMatrix(result.worldTransform, relativeTo: nil) }
解决方案
方案1:单独禁用指示器Plane的Grounding Shadow
通过设置实体的阴影投射与接收属性,让指示器不参与grounding shadow的计算:
在创建indicatorEntity后添加以下代码:
// 禁止投射阴影 indicatorEntity.shadowCastingMode = .off // 禁止接收阴影 indicatorEntity.receivesShadow = false
UnlitMaterial本身不参与光照计算,但grounding shadow属于环境阴影,通过上述设置可让指示器完全避开grounding shadow的影响,同时不干扰其他模型的grounding shadow效果。
方案2:解决闪烁的根本原因(保留Grounding Shadow)
闪烁通常由深度冲突(Z-Fighting)或位置更新与阴影计算不同步导致,可通过以下两种方式解决:
方式一:给指示器添加微小偏移
在更新指示器位置时,将其沿Y轴向上偏移极小距离,避免与AR估算的平面重叠:
func session(_ session: ARSession, didUpdate frame: ARFrame) { guard let result = self.arView.raycast(from: arView.center, allowing: .estimatedPlane, alignment: .horizontal).first else { return } var transform = result.worldTransform // 添加0.001米的向上偏移,避免深度冲突 transform.columns.3.y += 0.001 indicatorEntity.setTransformMatrix(transform, relativeTo: nil) }
方式二:调整材质渲染顺序
让指示器材质优先于阴影渲染,减少闪烁概率:
在创建material后添加:
material.renderingOrder = -1
内容的提问来源于stack exchange,提问作者Xtuphe
相关产品推荐
相关产品推荐

