ARSCNView unprojectPoint

时间:2018-03-30 11:43:10

标签: swift scenekit augmented-reality arkit

我需要将ARSCNView的二维坐标空间中的一个点转换为三维空间中的坐标。基本上是从视点到触摸位置的光线(最远距离一定距离)。

我想使用arView.unprojectPoint(vec2d),但返回的点似乎总是位于视图的中心

vec2d是从{2}坐标创建的SCNVector3

SCNVector3(x, y, 0) // 0 specifies camera near plane

我做错了什么?如何获得所需的结果?

2 个答案:

答案 0 :(得分:1)

我想你需要这样的功能:

func calcVector(screenPos: CGPoint) -> SCNVector3? {

    let planeTestResults = self.hitTest(screenPos, types: [.featurePoint])

    if let result = planeTestResults.first {
        return SCNVector3.positionFromTransform(result.worldTransform)
    }
    return nil
}

答案 1 :(得分:0)

在摄像机前面添加一个空节点,其偏移量为“ x”厘米,并将其作为摄像机的子级。

    //Add a node in front of camera just after creating scene
    hitNode = SCNNode()
    hitNode!.position = SCNVector3Make(0, 0, -0.25)  //25 cm offset
    sceneView.pointOfView?.addChildNode(hitNode!)


func unprojectedPosition(touch: CGPoint) -> SCNVector3 {
    guard let hitNode = self.hitNode else {
        return SCNVector3Zero
    }

    let projectedOrigin = sceneView.projectPoint(hitNode.worldPosition)
    let offset = sceneView.unprojectPoint(SCNVector3Make(Float(touch.x), Float(touch.y), projectedOrigin.z))

    return offset
}

See the Justaline GitHub implementation of the code here