如何解决如何在RealityKit中为USDZ文件制作阴影?
我使用的是this中等故事中的代码,但是我没有使用RealityComposer。 我在锚点上添加了一个简单的球体和平面。但是结果很奇怪,球体投射了三盏灯,但是飞机只有Spotlight。另一个问题是我看不到任何阴影。
有人可以帮忙吗?非常感谢!
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,-3])
lightAnchor.addChild(directLight)
lightAnchor.addChild(spotLight)
lightAnchor.addChild(pointLight)
scene.addAnchor(lightAnchor)
}
}
解决方法
RealityKit中的灯光具有一些特殊之处:
-
DirectionalLight()
- 位置不重要
- 方向很重要
- 有阴影
-
SpotLight()
- 位置很重要
- 方向很重要
- 有阴影
-
PointLight()
- 位置很重要
- 方向并不重要
- 没有阴影
以下是这些光源类型在代码中的外观:
@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])
usdzEntity.addChild(entity)
let usdzAnchorEntity = AnchorEntity()
usdzAnchorEntity.addChild(usdzEntity)
arView.scene.addAnchor(usdzAnchorEntity)
let lightAnchor = AnchorEntity(world: [0,2.5])
lightAnchor.addChild(directLight)
lightAnchor.addChild(spotLight)
lightAnchor.addChild(pointLight)
arView.scene.addAnchor(lightAnchor)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。