【问题标题】: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()
}
}
这开始工作正常,但我仍然需要找到一种方法来制作动画。