我试图在捏手势上实现缩放,但每次我再次捏时,模型会自行重置。
func zoom(scale: Double){
self.cameraNode.camera!.xFov = scale
self.cameraNode.camera!.yFov = scale
}
func handlePinch(gestureRecognize: UIPinchGestureRecognizer) {
if gestureRecognize.numberOfTouches() == 2 {
let zoom = gestureRecognize.scale
if (gestureRecognize.state == UIGestureRecognizerState.Began){
startScale = lastScale
bimScene.zoom(startScale)
}
if (gestureRecognize.state == UIGestureRecognizerState.Changed){
startScale = Double(100/zoom)
bimScene.zoom(startScale)
}
if (gestureRecognize.state == UIGestureRecognizerState.Ended){
lastScale = startScale
}
}
}
我还不熟悉scenekit,所以我觉得这很奇怪。有人能解释一下这个原因吗?
答案 0 :(得分:4)
你很接近,逻辑稍微偏离。
开始的情况很好,你需要“记住”捏开始的比例,这可能是你上次缩放时设定的比例。
您更改的案例有两个问题。
startScale = Double(100/zoom)
仅基于手势识别器比例,此比例仅适用于当前捏合(因此每次捏合都会重置)。这需要基于GR等级,以及在捏合开始时“记住”的比例。startScale
重置为新值。这给出了“指数”类型的缩放效果;你不想要这个。结束的案例只需要设置比例值,这样我们就可以记住从下一次捏合开始的内容。在这种情况下,它可能有点多余,您可能会逃脱startScale = startScale * zoom
并且在开始的情况下根本没有任何内容。
没有测试下面的内容,但希望它能为您提供一些想法。传递给zoom
func的值实际上是一个视角的视野,所以我重新命名它以区别于各种尺度。 FOV将在30-60deg之间,而尺度更像是在0.1-10(非常粗略)范围内。
func handlePinch(gestureRecognize: UIPinchGestureRecognizer) {
if gestureRecognize.numberOfTouches() == 2 {
let zoom = gestureRecognize.scale
if (gestureRecognize.state == UIGestureRecognizerState.Began){
startScale = lastScale
} else if (gestureRecognize.state == UIGestureRecognizerState.Changed){
let fov = Double(100/(startScale * zoom))
bimScene.zoom(fov)
} else {
lastScale = startScale * zoom
}
}
}
答案 1 :(得分:0)
这是处理特定节点的ZOOM的另一种方法,如果有任何需要在不改变相机视角的情况下实现这一点。
-(void)handlePinch:(UIPinchGestureRecognizer*)gestureRecognizer {
if (gestureRecognizer.numberOfTouches == 2) {
CGFloat zoom = gestureRecognizer.scale;
if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
lastScale = yourNode.scale.x;
} else if (gestureRecognizer.state == UIGestureRecognizerStateChanged) {
double final = lastScale * zoom;
yourNode.scale = SCNVector3Make(final, final, final);
}
}
}