Swift 阿基特&x2013;有没有办法知道物体在与ARCamera相关的空间中的位置?
我在ARKit的屏幕上有一个物体,我想知道它和摄像机方向之间的水平角,或者至少这个物体在屏幕的左边、中间还是右边 肯定(有点) 首先,我们需要理解它Swift 阿基特&x2013;有没有办法知道物体在与ARCamera相关的空间中的位置?,swift,scenekit,augmented-reality,arkit,triangulation,Swift,Scenekit,Augmented Reality,Arkit,Triangulation,我在ARKit的屏幕上有一个物体,我想知道它和摄像机方向之间的水平角,或者至少这个物体在屏幕的左边、中间还是右边 肯定(有点) 首先,我们需要理解它 ARKit对象不在实际的空间中,并且基于摄影机所看到的内容 相机不完美;你会注意到“静止”的物体由于光线、周围环境等而四处移动 没有人的手是稳定的;不仅物体会移动,手机也会做一些小的调整 现在,提供了这些信息,我们可以使用已知的变量来计算3个已知位置之间的角度(当然是在3D空间中!) 使用,我们可以看到,通过大量的数学运算,我们可以从3个3D
实际的
空间中,并且基于摄影机所看到的内容
现在,进入它的代码 让我们得到我们的变量
SCNSceneRendererDelegate
对象
userViewDirection
——我能想到的最好的方法是创建一个新的SCNNode
,并将它放在你面前一段距离。我们可以通过使用什么是cameraNode?没关系,我想是
sceneView.pointOfView
func renderer(_ renderer: SCNSceneRenderer, willRenderScene scene: SCNScene, atTime time: TimeInterval) {
guard let pointOfView = sceneView.pointOfView else { return }
let transform = pointOfView.transform
let orientation = SCNVector3(-transform.m31, -transform.m32, transform.m33)
let location = SCNVector3(transform.m41, transform.m42, transform.m43)
let currentPositionOfCamera = orientation + location
print(currentPositionOfCamera)
}
func +(lhv:SCNVector3, rhv:SCNVector3) -> SCNVector3 {
return SCNVector3(lhv.x + rhv.x, lhv.y + rhv.y, lhv.z + rhv.z)
}
let anObject = SCNNode()
let pos = anObject.position
func updatePositionAndOrientationOf(_ node: SCNNode, withPosition position: SCNVector3, relativeTo referenceNode: SCNNode) {
let referenceNodeTransform = matrix_float4x4(referenceNode.transform)
// Setup a translation matrix with the desired position
var translationMatrix = matrix_identity_float4x4
translationMatrix.columns.3.x = position.x
translationMatrix.columns.3.y = position.y
translationMatrix.columns.3.z = position.z
// Combine the configured translation matrix with the referenceNode's transform to get the desired position AND orientation
let updatedTransform = matrix_multiply(referenceNodeTransform, translationMatrix)
node.transform = SCNMatrix4(updatedTransform)
}
//Create a global node
let lookingNode:SCNNode = SCNNode()
//Now update node say `2` away in the Z (looking direction)
let position = SCNVector3(x: 0, y: 0, z: -2)
updatePositionAndOrientationOf(lookingNode, withPosition: position, relativeTo: cameraNode)
//Vertex is pos1
func calculateAngleBetween3Positions(pos1:SCNVector3, pos2:SCNVector3, pos3:SCNVector3) -> Float {
let v1 = SCNVector3(x: pos2.x-pos1.x, y: pos2.y-pos1.y, z: pos2.z-pos1.z)
let v2 = SCNVector3(x: pos3.x-pos1.x, y: pos3.y-pos1.y, z: pos3.z-pos1.z)
let v1Magnitude = sqrt(v1.x * v1.x + v1.y * v1.y + v1.z * v1.z)
let v1Normal = SCNVector3(x: v1.x/v1Magnitude, y: v1.y/v1Magnitude, v1.z/v1Magnitude)
let v2Magnitude = sqrt(v2.x * v2.x + v2.y * v2.y + v2.z * v2.z)
let v2Normal = SCNVector3(x: v2.x/v2Magnitude, y: v2.y/v2Magnitude, v2.z/v2Magnitude)
let result = v1Normal.x * v2Normal.x + v1Normal.y * v2Normal.y + v1Normal.z * v2Normal.z
let angle = acos(result)
return angle
}