我正在尝试放置一个朝向照相机的定向光以模拟太阳(因为用户将照相机指向太阳,然后按下按钮以放置定向光源)。
到目前为止,我已经尝试获取相机视角的quaternion conjugate并将其分配给灯光旋转。但是,此方法似乎不起作用,并且光线的最终位置似乎相当随机。任何有关如何通常处理的建议都将受到赞赏。 这是我的代码:
//Disable the default lightning updates
sceneView.autoenablesDefaultLighting = false
sceneView.automaticallyUpdatesLighting = false
var sunLight = SCNLight()
sunLight.intensity = 1000
sunLight.type = .directional
sunLight.color = UIColor.white
sunLight.castsShadow = true
sunLight.shadowMode = .forward
sunLight.automaticallyAdjustsShadowProjection = true
var sunNode = SCNNode()
sunNode.light = sunLight
sunNode.castsShadow = true
guard let cameraNode = self.sceneView.pointOfView else { return }
let q = cameraNode.orientation
let qConjugate = SCNVector4(x: -q.x, y: -q.y, z: -q.z, w: q.w)
sunNode.rotation = qConjugate
sceneView.scene.rootNode.addChildNode(sunNode)
通过放置一个球体,我可以看到光来自哪个方向:
let sphere = SCNSphere(radius: 0.3)
sphere.firstMaterial?.diffuse.contents = UIColor.green.withAlphaComponent(1)
let sphereNode = SCNNode(geometry: sphere)
sphereNode.position = SCNVector3(0,0,0)
sceneView.scene.rootNode.addChildNode(sphereNode)
答案 0 :(得分:0)
在应该使用SCNConstraint
的情况下。使节点始终指向当前摄像机的约束是SCNBillboardConstraint
。
SCNBillboardConstraint
对象会自动调整节点的方向,以使其局部z轴始终指向当前用于渲染场景的pointOfView
节点。例如,您可以使用广告牌约束使用二维Sprite图像而不是三维几何图形有效地渲染场景的一部分–通过将Sprite映射到受Billboard约束影响的平面上,这些Sprite相对于查看器保持其方向
let sunNode = SCNNode()
sunNode.light = SCNLight()
sunNode.light!.type = .directional
sunNode.light!.color = UIColor.yellow
sunNode.light!.intensity = 5000
let sunConstraint = SCNBillboardConstraint()
sunNode.constraints = [SCNBillboardConstraint()]
sunNode.constraints?.append(sunConstraint)