【问题标题】:ARKit limit display distance of a nodeARKit 限制节点的显示距离
【发布时间】:2018-09-06 21:18:59
【问题描述】:

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

【问题讨论】:

  • 如果您发布到目前为止的内容,我会看看 :)

标签: swift constraints scenekit arkit


【解决方案1】:

我不完全确定我已理解您的意思,但您似乎总是希望您的 SCNNode 位于距离相机 1m 的位置,但保留其其他 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)

 }

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

希望这会为您指明正确的方向...

【讨论】:

    【解决方案2】:

    上面的答案并不完全是我所需要的——我希望对象像刚刚放置在正常位置一样被显示,所以我可以离它更近更远,但限制我可以离它多近/多远那个物体。当我超出该限制时,对象应该开始移动以始终在距相机的给定距离范围内。无论如何,我认为我已经找到了一些正确的方向。我没有分配位置,而是创建了一个约束,该约束不断更新我的节点的位置,如果它在用户的给定范围内,则要么处于给定位置,否则,调整此位置以适应该范围:

    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()
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 2019-03-29
      • 2018-11-28
      • 2019-06-15
      • 2018-05-18
      • 2018-01-13
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多