如何在RealityKit中为USDZ文件制作阴影?

问题描述

我使用的是this中等故事中的代码,但是我没有使用RealityComposer。 我在锚点上添加了一个简单的球体和平面。但是结果很奇怪,球体投射了三盏灯,但是飞机只有Spotlight。另一个问题是我看不到任何阴影。

有人可以帮忙吗?非常感谢!

enter image description here

func session(_ session: ARSession,didAdd anchors: [ARAnchor]) {

    for anchor in anchors {

        let sphere = MeshResource.generateSphere(radius: 0.2)
        let simplemodel = ModelEntity(mesh: sphere,materials: [SimpleMaterial(color: .white,isMetallic: false)])
        usdzEntity = simplemodel
        usdzEntity.generateCollisionShapes(recursive: true)

        // Plane primitive
        let plane: MeshResource = .generatePlane(width: 1.0,depth: 1.0)
        let material = SimpleMaterial(color: .white,isMetallic: false)
        let entity = ModelEntity(mesh: plane,materials: [material])
        usdzEntity.addChild(entity)

        usdzAnchorEntity = AnchorEntity(anchor: anchor)
        usdzAnchorEntity.addChild(usdzEntity)
        scene.addAnchor(usdzAnchorEntity)

        let lightAnchor = AnchorEntity(world: [0,-3])
        lightAnchor.addChild(directLight)
        lightAnchor.addChild(spotLight)
        lightAnchor.addChild(pointLight)
        scene.addAnchor(lightAnchor)
    }
}

解决方法

RealityKit中的灯光具有一些特殊之处:

  • DirectionalLight()

    • 位置不重要
    • 方向很重要
    • 有阴影
  • SpotLight()

    • 位置很重要
    • 方向很重要
    • 有阴影
  • PointLight()

    • 位置很重要
    • 方向并不重要
    • 没有阴影

enter image description here

以下是这些光源类型在代码中的外观:

@IBOutlet var arView: ARView!

override func viewDidLoad() {
    super.viewDidLoad()
    arView.backgroundColor = .black
    
    let directLight = DirectionalLight()
    directLight.light.color = .red
    directLight.light.intensity = 10000
    directLight.position.x = 0
    directLight.orientation = simd_quatf(angle: Float.pi/5,axis: [0,1,0])
    directLight.shadow = .init(DirectionalLightComponent.Shadow(maximumDistance: 5,depthBias: 1))
    
    let spotLight = SpotLight()
    spotLight.light.color = .green
    spotLight.light.intensity = 450000
    spotLight.position.x = -1.1
    spotLight.shadow = .init()
    
    let pointLight = PointLight()
    pointLight.light.color = .blue
    pointLight.light.intensity = 700000
    pointLight.position.x = 3.0
    // pointLight has no shadows
    // pointLight's intensity is much higher than Directional's or Spot's one


    // SPHERE
    let sphere = MeshResource.generateSphere(radius: 0.4)
    let simpleModel = ModelEntity(mesh: sphere,materials: [SimpleMaterial(color: .lightGray,isMetallic: true)])
    let usdzEntity = simpleModel
    usdzEntity.generateCollisionShapes(recursive: true)

    // PLANE
    let plane: MeshResource = .generatePlane(width: 2.0,depth: 2.0)
    let material = SimpleMaterial(color: .lightGray,isMetallic: false)
    let entity = ModelEntity(mesh: plane,materials: [material])
    entity.orientation = simd_quatf(angle: Float.pi/4,axis: [1,0])
    usdzEntity.addChild(entity)

    let usdzAnchorEntity = AnchorEntity()
    usdzAnchorEntity.addChild(usdzEntity)
    arView.scene.addAnchor(usdzAnchorEntity)

    let lightAnchor = AnchorEntity(world: [0,2.5])
    lightAnchor.addChild(directLight)
    lightAnchor.addChild(spotLight)
    lightAnchor.addChild(pointLight)
    arView.scene.addAnchor(lightAnchor)
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...