У меня есть простой SCNNode, который находится в реальной позиции, узел соответствует ориентиру с известными координатами. С точки зрения пользователя, я хочу, чтобы SCNNode имел одинаковый размер, несмотря на изменение расстояния между местоположением узла и пользователем / ARcamera. Вот мой код, пока это очень грубый способ вычислить масштаб на основе расстояния.
func renderer(_ renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: TimeInterval) {
self.updateScaleOfNodes(node: nodeAdded, fromPointOfView: self.sceneView.pointOfView!)
}
func updateScaleOfNodes(node: SCNNode, fromPointOfView pointofView: SCNNode){
//Find the 3D objects position
let nodePosition = SCNVector3ToGLKVector3(node.worldPosition)
//Find the cameras current position
let currentCameraPosition = SCNVector3ToGLKVector3(pointofView.worldPosition)
//Find the distance between camera and 3D object
let distanceBetweenCameraAndNode = GLKVector3Distance(nodePosition, currentCameraPosition)
self.locationAcc.isHidden = false
let distance_test = "Distance between camera and node:" + String(distanceBetweenCameraAndNode)
self.locationAcc.text = distance_test
//180 metres
//NOTE: Do not calculate delta distance between node and current position because that focuses on the size of each step rather than how far away your current position is from the node
//Begin animation
SCNTransaction.begin()
SCNTransaction.animationDuration = 0.3
//Multiply distance by scaling factor
//Each metre you walk away the node scales down by 1cm
let scale:Float = 1/1000 * distanceBetweenCameraAndNode
//Calculate the scale difference (moving closer will make node larger)
let scaleDiff:Float = 1 - scale
//Assign the scale to 3D object
node.scale = SCNVector3(scaleDiff * Float(scale_W), scaleDiff * Float(scale_H), scaleDiff * Float(scale_l))
SCNTransaction.commit()
}
Когда я проверил этот код, я обнаружил, что некоторые объекты работают хорошо там, где другие не. Есть ли лучшее решение, которое можно применить ко всем объектам разных размеров? Я искал решение с использованием поля зрения, но я не совсем уверен, что это лучшее решение, чем это. Любые рекомендации и советы будут с благодарностью.
Заранее спасибо