1

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

任何人都可以帮忙吗?非常感谢!

在此处输入图像描述

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,0,-3])
        lightAnchor.addChild(directLight)
        lightAnchor.addChild(spotLight)
        lightAnchor.addChild(pointLight)
        scene.addAnchor(lightAnchor)
    }
}
4

1 回答 1

1

RealityKit 中的灯光有一些特点:

  • 定向光()

    • 位置不重要
    • 方向很重要
    • 有阴影
  • 聚光灯()

    • 位置很重要
    • 方向很重要
    • 有阴影
  • 点光源()

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

在此处输入图像描述

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

@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, 0])
    usdzEntity.addChild(entity)

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

    let lightAnchor = AnchorEntity(world: [0, 0, 2.5])
    lightAnchor.addChild(directLight)
    lightAnchor.addChild(spotLight)
    lightAnchor.addChild(pointLight)
    arView.scene.addAnchor(lightAnchor)
}
于 2020-08-28T14:23:01.103 回答