3

我在 Reality Composer 中合成了一个场景,并在其中添加了 3 个对象。问题是阴影太浓(暗)。

我尝试在此答案中使用 RealityKit 中的定向光,而不是 Reality Composer 中的默认光(因为您没有调整其中光的选项)。

在此处输入图像描述

更新 我按照@AndyFedo 在答案中的解释实现了聚光灯照明。影子还是那么黑。

在此处输入图像描述

4

2 回答 2

3

如果您需要在场景中使用柔和和半透明的阴影,请使用在使用类或实现协议SpotLight时可用的照明设备。默认为北向。目前,RealityKit 中没有阴影的实例属性。SpotLightHasSpotLightSpotLightopacity

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对于更大的对象,您必须为and使用更高的值attenuationRadius

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

在此处输入图像描述


你也可以在 Medium 上阅读我关于 RealityKit 灯的故事。

于 2020-01-17T11:51:22.047 回答
3

当我在“场景开始”上使用“隐藏”动作序列并发布通知以在点击手势上调用“显示”动作序列时,阴影看起来更暗。当我将对象缩放到 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
        }

    }
}
于 2020-01-21T09:37:35.263 回答