ARKit限制节点的显示距离

时间:2018-03-28 09:02:13

标签: swift constraints scenekit arkit

我想在sceneView中创建一个节点,该节点在position的正常scene处显示,直到用户离它太近或太远。然后它应该从用户显示在相同的方向,但距离有限。到目前为止,我发现最好的是SCNDistanceConstraint,它限制了这个距离,但问题是,这个约束移动了节点之后,这个节点就停留在这个新的位置。因此,例如,我想限制节点显示距离相机不超过一米。我越来越接近节点了,它被推开了,但是当我拿回相机时,这个节点应该返回原来的位置 - 现在它停留在被推动的位置。是否有一些简单的方法来获得这种行为?

2 个答案:

答案 0 :(得分:0)

我不完全确定我理解你的意思,但似乎你总是希望你的SCNNode距离相机1米远,但保留其他x,y值?

如果是这种情况,那么你可以这样做:

func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {

        //1. Get The Current Node On Screen & The Camera Point Of View
        guard let nodeToPosition = currentNode, let pointOfView = augmentedRealityView.pointOfView else { return }

        //2. Set The Position Of The Node 1m Away From The Camera
        nodeToPosition.simdPosition.z = pointOfView.presentation.worldPosition.z - 1

        //3. Get The Current Distance Between The SCNNode & The Camera
        let positionOfNode = SCNVector3ToGLKVector3(nodeToPosition.presentation.worldPosition)

        let positionOfCamera = SCNVector3ToGLKVector3(pointOfView.presentation.worldPosition)

        let distanceBetweenNodeAndCamera = GLKVector3Distance(positionOfNode, positionOfCamera)

        print(distanceBetweenNodeAndCamera)

 }

我已在第三部分中添加,因此您可以使用距离进行一些额外的计算等。

希望这能指出你正确的方向......

答案 1 :(得分:0)

上面的答案并不完全符合我的要求 - 我希望对象能够显示为刚放置在正常位置,这样我就可以越来越接近它,但是限制了我可以接近/远离的距离那个对象。当我超出该限制时,对象应该开始移动到始终在距离相机的给定距离范围内。无论如何,我认为我已经找到了一些正确的方向。我正在创建一个约束,不断更新我的节点的位置,如果它在给定的范围内,或者如果没有,则调整此位置以适应该范围:

private func setupConstraint() {
    guard let mainNodeDisplayDistanceRange = mainNodeDisplayDistanceRange else {
        constraints = nil
        position = requestedPosition
        return
    }
    let constraint = SCNTransformConstraint.positionConstraint(inWorldSpace: true) { (node, currentPosition) -> SCNVector3 in
        var cameraPositionHorizontally = (self.augmentedRealityView as! AugmentedRealityViewARKit).currentCameraPosition
        cameraPositionHorizontally.y = self.requestedPosition.y
        let cameraToObjectVector = self.requestedPosition - cameraPositionHorizontally
        let horizontalDistanceFromCamera = Double((cameraToObjectVector).distanceHorizontal)
        guard mainNodeDisplayDistanceRange ~= horizontalDistanceFromCamera else {
            let normalizedDistance = horizontalDistanceFromCamera.keepInRange(mainNodeDisplayDistanceRange)
            let normalizedPosition = cameraPositionHorizontally + cameraToObjectVector.normalizeHorizontally(toDistance: normalizedDistance)
            return normalizedPosition
        }
        return self.requestedPosition
    }
    constraints = [constraint]
}

internal var requestedPosition: SCNVector3 = .zero {
    didSet {
        setupConstraint()
    }
}

这开始工作正常,但我仍然需要找到一种方法来设置动画。