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