Swift 阿基特&x2013;有没有办法知道物体在与ARCamera相关的空间中的位置?

Swift 阿基特&x2013;有没有办法知道物体在与ARCamera相关的空间中的位置?,swift,scenekit,augmented-reality,arkit,triangulation,Swift,Scenekit,Augmented Reality,Arkit,Triangulation,我在ARKit的屏幕上有一个物体,我想知道它和摄像机方向之间的水平角,或者至少这个物体在屏幕的左边、中间还是右边 肯定(有点) 首先,我们需要理解它 ARKit对象不在实际的空间中,并且基于摄影机所看到的内容 相机不完美;你会注意到“静止”的物体由于光线、周围环境等而四处移动 没有人的手是稳定的;不仅物体会移动,手机也会做一些小的调整 现在,提供了这些信息,我们可以使用已知的变量来计算3个已知位置之间的角度(当然是在3D空间中!) 使用,我们可以看到,通过大量的数学运算,我们可以从3个3D

我在ARKit的屏幕上有一个物体,我想知道它和摄像机方向之间的水平角,或者至少这个物体在屏幕的左边、中间还是右边

肯定(有点)

首先,我们需要理解它

  • ARKit对象不在
    实际的
    空间中,并且基于摄影机所看到的内容

  • 相机不完美;你会注意到“静止”的物体由于光线、周围环境等而四处移动

  • 没有人的手是稳定的;不仅物体会移动,手机也会做一些小的调整

  • 现在,提供了这些信息,我们可以使用已知的变量来计算3个已知位置之间的角度(当然是在3D空间中!)

    使用,我们可以看到,通过大量的数学运算,我们可以从3个3D点得到一个角度


    现在,进入它的代码

    让我们得到我们的变量

  • 您可以使用
    SCNSceneRendererDelegate
  • 您可以通过执行以下操作获得
    对象
  • 你可以用一种稍微有创意的方式获得你的
    userViewDirection
    ——我能想到的最好的方法是创建一个新的
    SCNNode
    ,并将它放在你面前一段距离。我们可以通过使用
  • 现在我们有3个变量

    我们可以简单地对它们进行数学运算:)


    什么是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
    }