如何获取相机相对于其方向的SCNVector3位置 ARKit Swift



我试图在相机前面附加一个对象,但问题是它总是与初始相机方向有关。即使相机的方向是向上或向下,我如何调整/获取SCNVector3位置以将对象放置在前面?

这就是我现在的做法:

let ballShape = SCNSphere(radius: 0.03)
let ballNode = SCNNode(geometry: ballShape)
let viewPosition = sceneView.pointOfView!.position
ballNode.position = SCNVector3Make(viewPosition.x, viewPosition.y, viewPosition.z - 0.4)
sceneView.scene.rootNode.addChildNode(ballNode)

编辑以更好地回答问题,现在它已在评论中澄清

新答案:

您只使用摄影机的位置,因此如果摄影机旋转,它不会影响球。

你可以做的是得到球的变换矩阵,并将其乘以相机的变换矩阵。这样,球的位置将相对于相机的完整变换,包括旋转。

例如

let ballShape = SCNSphere(radius: 0.03)
let ballNode = SCNNode(geometry: ballShape)
ballNode.position = SCNVector3Make(0.0, 0.0, -0.4)
let ballMatrix = ballNode.transform
let cameraMatrix = sceneView.pointOfView!.transform
let newBallMatrix = SCNMatrix4Mult(ballMatrix, cameraMatrix)
ballNode.transform = newBallMatrix
sceneView.scene.rootNode.addChildNode(ballNode)

或者,如果你只想要SCNVector3的位置,准确地回答你的问题(这样球就不会旋转):

...
let newBallMatrix = SCNMatrix4Mult(ballMatrix, cameraMatrix)
let newBallPosition = SCNVector3Make(newBallMatrix.m41, newBallMatrix.m42, newBallMatrix.m43)
ballNode.position = newBallPosition
sceneView.scene.rootNode.addChildNode(ballNode)

旧答案:

您只使用摄影机的位置,因此摄影机旋转时不会影响球。

SceneKit使用节点的层次结构,因此当一个节点是另一个节点的"子节点"时,它会遵循其"父节点"的位置、旋转和比例。将一个对象附加到另一个对象(在本例中为摄影机)的正确方法是使其成为摄影机的"子对象"。

然后,当设置"子"节点的位置、旋转或变换的任何其他方面时,就是相对于其父节点进行设置。因此,如果将位置设置为SCNVector3Make(0.0, 0.0, -0.4),它将在"父"平移之上平移-0.4个Z单位。

因此,要做出你想要的,它应该是:

let ballShape = SCNSphere(radius: 0.03)
let ballNode = SCNNode(geometry: ballShape)
ballNode.position = SCNVector3Make(0.0, 0.0, -0.4)
let cameraNode = sceneView.pointOfView
cameraNode?.addChildNode(ballNode)

这样,当摄影机旋转时,球会完全跟随其旋转,但与摄影机的距离为-0.4个单位。

最新更新