Как я могу уменьшить непрозрачность теней в RealityKit? - PullRequest
1 голос
/ 17 января 2020

Я написал сцену в реальности Composer и добавил в нее 3 объекта. Проблема в том, что тени слишком яркие (темные).

Я пытался использовать Направленный свет в RealityKit из этого ответа, а не свет по умолчанию из Reality Composer (поскольку у вас нет возможности отрегулировать в нем свет).

enter image description here

Обновление Я реализовал прожекторное освещение, как объяснено @AndyFedo в ответе. Тень все еще такая темная.

enter image description here

Ответы [ 2 ]

3 голосов
/ 17 января 2020

Если вам нужны мягкие и полупрозрачные тени в вашей сцене , используйте осветительный прибор SpotLight, который доступен при реализации протокола HasSpotLight. По умолчанию SpotLight ориентирован на север. На данный момент в RealityKit нет opacity свойства экземпляра для теней.

outerAngleInDegrees свойство экземпляра должно быть не более 179 degrees.

import RealityKit

class Lighting: Entity, HasSpotLight {

    required init() {
        super.init()

        self.light = SpotLightComponent(color: .yellow,
                                    intensity: 50000,
                          innerAngleInDegrees: 90,
                          outerAngleInDegrees: 179,  // greater angle – softer shadows
                            attenuationRadius: 10)   // can't be Zero
    }
}

Затем создайте shadow экземпляр:

class ViewController: NSViewController {

    @IBOutlet var arView: ARView!

    override func awakeFromNib() { 
        arView.environment.background = .color(.black)

        let spotLight = Lighting().light
        let shadow = Lighting().shadow
        let boxAndCurlAnchor = try! Experience.loadBoxAndCurl()

        boxAndCurlAnchor.components.set(shadow!)
        boxAndCurlAnchor.components.set(spotLight)

        arView.scene.anchors.append(boxAndCurlAnchor)
    }
}

Вот изображение, созданное без этой строки: boxAnchor.components.set(shadow!).

enter image description here

Вот изображение, полученное со следующим значением outerAngleInDegrees = 140:

enter image description here

Вот изображение, полученное со следующим значением outerAngleInDegrees = 179:

enter image description here

В комнате держите прожектор SpotLight на высоте 2 ... 4 метра от модели.

Для более крупных объектов вы должны использовать более высокие значения для intensity и attenuationRadius:

self.light = SpotLightComponent(color: .white,
                            intensity: 625000,
                  innerAngleInDegrees: 10,
                  outerAngleInDegrees: 120,
                    attenuationRadius: 10000)

enter image description here

2 голосов
/ 21 января 2020

Тени кажутся темнее, когда я использую последовательность действий «Скрыть» в «Пуск сцены» и публикую уведомление, чтобы вызвать последовательность действий «Показать» при жесте касания. Тени были исправлены, когда я масштабировал Объект до 0% и отправлял Уведомление для вызова последовательности действий «Переместить, Повернуть, Масштабировать» при жесте касания.

Масштабированное изображение

enter image description here

Показать изображение

enter image description here

Разница объектов со скрытыми и масштабированными действиями

enter image description here

import UIKit

import RealityKit

import ARKit


class Lighting: Entity, HasDirectionalLight {
    required init() {
        super.init()
        self.light = DirectionalLightComponent(color: .red, intensity: 1000, isRealWorldProxy: true)
    }
}

class SpotLight: Entity, HasSpotLight {

    required init() {
        super.init()
        self.light = SpotLightComponent(color: .yellow,
                                        intensity: 50000,
                                        innerAngleInDegrees: 90,
                                        outerAngleInDegrees: 179, // greater angle – softer shadows
            attenuationRadius: 10) // can't be Zero

    }
}

class ViewController: UIViewController {

    @IBOutlet var arView: ARView!

    enum TapObjects {
        case None
        case HiddenChair
        case ScaledChair
    }    
    var furnitureAnchor : Furniture._Furniture!
    var tapObjects : TapObjects = .None

    override func viewDidLoad() {
        super.viewDidLoad()

        furnitureAnchor = try! Furniture.load_Furniture()
        arView.scene.anchors.append(furnitureAnchor)

        addTapGesture()

    }

    func addTapGesture() {
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(onTap))
        arView.addGestureRecognizer(tapGesture)
    }

    @objc func onTap(_ sender: UITapGestureRecognizer) {

        switch tapObjects {
        case .None:
            furnitureAnchor.notifications.unhideChair.post()
            tapObjects = .HiddenChair
        case .HiddenChair:
            furnitureAnchor.notifications.scaleChair.post()
            tapObjects = .ScaledChair
        default:
            break
        }

    }
}
...