Как уменьшить непрозрачность теней в RealityKit?

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

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

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

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

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


person Saad Tahir    schedule 17.01.2020    source источник
comment
Дело просто в том, чтобы отодвинуть объект от источника света или наоборот, не так ли?   -  person El Tomato    schedule 17.01.2020


Ответы (2)


Если вам нужны мягкие и полупрозрачные тени в вашей сцене, используйте SpotLight осветительную арматуру, которая доступна при использовании класса 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!).

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

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

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

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

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

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

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

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

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


Также вы можете прочитать мою ИСТОРИЮ об источниках света RealityKit на Medium. .

person Andy Fedoroff    schedule 17.01.2020
comment
Я добавил это, но тень вроде не меняется :( - person Saad Tahir; 21.01.2020
comment
Какое расстояние между моделью и осветительной арматурой? - person Andy Fedoroff; 21.01.2020
comment
Я не менял расстояние для освещения. Я только что добавил модель в свой ARView. Я не использовал темный фон. - person Saad Tahir; 21.01.2020
comment
Какой формат у этой модели: rcproject или usdz? - person Andy Fedoroff; 21.01.2020
comment
Кто сделал эту модель, вы или нет? - person Andy Fedoroff; 21.01.2020
comment
Нет, я не делал эту модель. Мой художник сделал. На самом деле эти модели отлично работают в ARScene без Reality Composer. Не знаю, почему это странно в Realty Composer. - person Saad Tahir; 21.01.2020
comment
Не могли бы вы загрузить его на файловый хостинг? Я взгляну. - person Andy Fedoroff; 21.01.2020
comment
Мне нужна там регистрация. Могли бы вы воспользоваться другим хостингом (без регистрации)? - person Andy Fedoroff; 21.01.2020
comment
Тень даже не работает для встроенных файлов usdz в Reality Composer. Я нашел проблему. Это было с набором «Поведение в реальности». Когда я скрываю их в начале сеанса и показываю при нажатии, тень становится слишком темной. Но когда я уменьшаю их в начале сеанса и увеличиваю при нажатии, тень становится идеальной. - person Saad Tahir; 21.01.2020

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

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

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

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

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

Различие объектов со скрытыми и масштабируемыми действиями

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

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
        }

    }
}
person Saad Tahir    schedule 21.01.2020
comment
Что вы делаете с классами SpotLight и Lighting? Вы не используете их в своем коде - person Nativ; 12.09.2020
comment
Вместо подсветки я использовал другое уведомление - person Saad Tahir; 13.09.2020