Я пытаюсь разместить направленный свет, ориентированный на камеру, чтобы имитировать солнце (так как пользователь направляет камеру на солнце и нажимает кнопку для размещения источника направленного света).
До сих пор я пытался взять кватернионный конъюгат точки обзора камеры и назначить его на вращение источников света.Однако этот метод, похоже, не работает, и результирующее положение источника света кажется довольно случайным.Любое предложение о том, как это обычно обрабатывается, очень ценится.Это мой код:
//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)