一段时间以来,我一直在尝试为 RealityKit 中的对象添加逼真的地面阴影。对于我的用例,我不会使用 Reality Composer,也不会(根据这个问题)使用水平平面的锚实体(我的用户将点击以放置一个对象,并且该点击可以与水平平面对齐或ARMeshAnchor,因为我们在应用程序中支持 LiDAR)。
当我在 iOS 上通过 QuickLook 测试我的 USDZ 模型时,我看到 iOS 在我的模型下方添加了一个阴影,虽然并不完全真实,但与没有阴影相比,它看起来更“放置”在表面上。
在尝试添加我的模型时,我正在采取以下步骤;
self.model = Entity.load(named: "model.usdz")
当用户点击屏幕时,我执行光线投射并将模型添加到构建的锚点;
func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
for anchor in anchors {
if anchor.name == "tapped" {
let anchorEntity = AnchorEntity(anchor: anchor)
anchorEntity.addChild(self.model!)
arView.scene.addAnchor(anchorEntity)
}
}
}
当模型添加到轻敲点时,没有地面阴影。作为测试,我尝试添加定向光,相信它的位置可能会在物体上投射光,因此会产生阴影。我像这样创造光;
class Lighting: Entity, HasDirectionalLight {
required init() {
super.init()
self.light = DirectionalLightComponent(color: .white, intensity: 5000, isRealWorldProxy: true)
}
}
我添加了一个全局var lightEntity = AnchorEntity()
. 然后,在我的viewDidLoad
方法中,我试图像这样设置灯光;
let spotLight = Lighting().light
let shadow = Lighting().shadow
lightAnchor.components.set(shadow!)
lightAnchor.components.set(spotLight)
arView.scene.anchors.append(lightAnchor)
self.model = Entity.load(named: "model.usdz")
虽然我可以看到有光照射在物体上,但它似乎并没有造成任何阴影。