我在 Reality Composer 中合成了一个场景,并在其中添加了 3 个对象。问题是阴影太浓(暗)。
我尝试在此答案中使用 RealityKit 中的定向光,而不是 Reality Composer 中的默认光(因为您没有调整其中光的选项)。
更新 我按照@AndyFedo 在答案中的解释实现了聚光灯照明。影子还是那么黑。
我在 Reality Composer 中合成了一个场景,并在其中添加了 3 个对象。问题是阴影太浓(暗)。
我尝试在此答案中使用 RealityKit 中的定向光,而不是 Reality Composer 中的默认光(因为您没有调整其中光的选项)。
更新 我按照@AndyFedo 在答案中的解释实现了聚光灯照明。影子还是那么黑。
如果您需要在场景中使用柔和和半透明的阴影,请使用在使用类或实现协议
SpotLight
时可用的照明设备。默认为北向。目前,RealityKit 中没有阴影的实例属性。SpotLight
HasSpotLight
SpotLight
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
对于更大的对象,您必须为and使用更高的值attenuationRadius
:
self.light = SpotLightComponent(color: .white,
intensity: 625000,
innerAngleInDegrees: 10,
outerAngleInDegrees: 120,
attenuationRadius: 10000)
你也可以在 Medium 上阅读我关于 RealityKit 灯的故事。
当我在“场景开始”上使用“隐藏”动作序列并发布通知以在点击手势上调用“显示”动作序列时,阴影看起来更暗。当我将对象缩放到 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
}
}
}