在 RealityKit 中添加点光源

问题描述

我有一个非常简单的 RealityKit 场景(没有 AR),上面有一个盒子。虽然盒子的侧面是彩色的(我假设是因为认灯),但正面是黑色的。所以我决定在相机的位置添加一个点光源(基于其他 StackOverflow 答案,并且与框一个锚点相同),但框仍然是黑色的。我错过了什么?

override func viewDidLoad() {
        super.viewDidLoad()
        
        myARView.environment.background = .color(.black)

        let anchor = AnchorEntity()
        myARView.scene.anchors.append(anchor)
        
        let Box = MeshResource.generateBox(size: 0.3) // Generate mesh
        let material = SimpleMaterial(color: .blue,isMetallic: true)

        let entity = ModelEntity(mesh: Box,materials: [material])
        entity.name="My Box"
        entity.generateCollisionShapes(recursive: true)
        entity.position=SIMD3(x: 0.2,y: 0.8,z: -1)
        anchor.addChild(entity)
        
        let pointLight = PointLight()
        pointLight.light.color = .red
        pointLight.light.intensity = 15000000
        pointLight.light.attenuationRadius = 7.0
        pointLight.position = myARView.cameraTransform.translation // 0,2
        
        anchor.addChild(pointLight)
    }

enter image description here

解决方法

这里有几件事,最值得注意的是您的材质设置为 .blue,并且您尝试使用 .red 灯点亮它。由颜色制成的材料包含零红色(以 rgb 形式),因此光线对其没有影响。如果您使用带有红色滤镜的眼镜,绿色和蓝色只会呈现黑色,只有红色会透过。

即使您将其更改为 .white 灯,它看起来也不会有太大不同。这就是默认 SimpleMaterial 且 isMetallic 设置为 true 时的样子;您将看到的只是光线的反射,而不是看到光线击中它。

这是因为材质的粗糙度设置为 0,稍微增加一点,您会看到立方体被点光源点亮。

var material = SimpleMaterial(color: .blue,isMetallic: true)
material.roughness = 0.1

另外值得注意的是,你的光强度相当高,我认为这只是因为你之前没有看到效果!