Как я могу делать тени в RealityKit для файлов USDZ?

Я использую код из этого Средняя история, но я не использовал 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)
    }
}

person xin nai wang    schedule 28.08.2020    source источник


Ответы (1)


Освещение в RealityKit имеет некоторые особенности:

  • DirectionalLight ()

    • Position is not important
    • Ориентация важна
    • Есть тени
  • SpotLight ()

    • Position is important
    • Ориентация важна
    • Есть тени
  • PointLight ()

    • Position is important
    • Ориентация не важна
    • Без теней

введите описание изображения здесь

Вот как эти типы источников света выглядят в коде:

@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)
}
person Andy Fedoroff    schedule 28.08.2020
comment
Большое спасибо, это полезно! Теперь у меня есть свет и тени, новая проблема в том, что когда я меняю simpleModel на VideoMaterial с помощью let model = ModelEntity(mesh: sphere, materials: [VideoMaterial(avPlayer: player)]), свет и тень исчезают, есть идеи? - person xin nai wang; 31.08.2020
comment
VideoMaterial от RealityKit можно применять только с использованием Xcode 12+ и iOS 14+. Вот ссылка - developer.apple.com/documentation/realitykit/videomaterial - person Andy Fedoroff; 31.08.2020
comment
Да, я знаю, как использовать VideoMaterial, проблема в том, что VideoMaterial не отбрасывает тени ... - person xin nai wang; 01.09.2020
comment
Модель RealityKit, закрашенная с помощью VideoMaterial, ДЕЙСТВИТЕЛЬНО отбрасывает тени. Посмотрите, что нового в RealityKit WWDC 2020 - developer.apple.com/videos/play/wwdc2020 / 10612 (время 01:37) Если вы имеете в виду функцию самозатенения - вы правы, ни один шейдер в RealityKit не поддерживает ее (включая класс VideoMaterial). - person Andy Fedoroff; 01.09.2020
comment
Сорта крадет сообщение здесь, прежде чем создавать свой собственный ... но как я могу сделать тень, которая действует как тень AnchorEntity, которая работает с освещением ibl / environment, а не с настраиваемыми / универсальными? @AndyFedoroff Я просто хочу, чтобы теневой самолет работал с реальным освещением ... идеями? - person Dariusz; 18.06.2021
comment
Привет, @Dariusz, что ты имеешь в виду, говоря, что Сорта крадет пост перед тем, как сделать свой собственный ...? ))) - person Andy Fedoroff; 18.06.2021
comment
Опубликуйте свой вопрос, и я постараюсь на него ответить. - person Andy Fedoroff; 18.06.2021
comment
Что ж, это связано с тенями, я решил, что продолжу расширять этот пост для будущих парней, ищущих помощи; -) В любом случае вот сообщение ›Заранее благодарю вас за любую помощь ^^ stackoverflow.com/questions/68033965 / - person Dariusz; 18.06.2021