【问题标题】:How can I make shadows in RealityKit for USDZ files?如何在 RealityKit 中为 USDZ 文件制作阴影?
【发布时间】:2020-12-17 05:55:07
【问题描述】:

我使用来自this 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)
    }
}

【问题讨论】:

    标签: swift augmented-reality arkit realitykit usdz


    【解决方案1】:

    RealityKit 中的灯光有一些特点:

    • DirectionalLight()

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

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

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

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

    @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)
    }
    

    【讨论】:

    • 非常感谢,这很有帮助!现在我有了灯光和阴影,新问题是当我使用 let model = ModelEntity(mesh: sphere, materials: [VideoMaterial(avPlayer: player)]) 将 simpleModel 更改为 VideoMaterial 时,灯光和阴影都消失了,有什么想法吗?
    • RealityKit 的 VideoMaterial 只能使用 Xcode 12+ 和 iOS 14+ 应用。这是一个链接 - developer.apple.com/documentation/realitykit/videomaterial
    • 是的,我知道如何使用 VideoMaterial,问题是 VideoMaterial 不会投射阴影...
    • 在我自己制作之前先在​​这里“窃取”帖子......但是我怎样才能制作出与 ibl/环境灯而不是自定义/通用灯一起使用的 AnchorEntity 阴影的阴影? @AndyFedoroff 我只是想要一个阴影平面来处理现实世界的照明......想法?
    • 嗯,它与影子的东西有关,我想我会跟进扩展这篇文章,以供未来寻求帮助的小伙子;-)无论如何,这里是帖子>提前谢谢你的帮助^^stackoverflow.com/questions/68033965/…
    猜你喜欢
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 2021-09-03
    相关资源
    最近更新 更多