Ориентация направленного света на камеру в ARKit - PullRequest
1 голос
/ 13 апреля 2019

Я пытаюсь разместить направленный свет, ориентированный на камеру, чтобы имитировать солнце (так как пользователь направляет камеру на солнце и нажимает кнопку для размещения источника направленного света).

До сих пор я пытался взять кватернионный конъюгат точки обзора камеры и назначить его на вращение источников света.Однако этот метод, похоже, не работает, и результирующее положение источника света кажется довольно случайным.Любое предложение о том, как это обычно обрабатывается, очень ценится.Это мой код:

 //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)

1 Ответ

0 голосов
/ 28 апреля 2019

Это тот случай, когда вы должны использовать SCNConstraint. Ограничение, которое ориентирует узел, чтобы он всегда указывал на текущую камеру, равно SCNBillboardConstraint.

Объект SCNBillboardConstraint автоматически регулирует ориентацию узла, так что его локальная ось z всегда указывает на узел pointOfView, используемый в данный момент для визуализации сцены. Например, вы можете использовать ограничение рекламного щита, чтобы эффективно визуализировать части сцены, используя двумерные изображения спрайтов вместо трехмерной геометрии - путем отображения спрайтов на плоскости, на которые воздействует ограничение рекламного щита, спрайты сохраняют свою ориентацию по отношению к зрителю. .

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)
...