SceneKit相机节点重置捏手势

时间:2016-07-26 21:00:29

标签: ios swift uigesturerecognizer scenekit uipinchgesturerecognizer

我试图在捏手势上实现缩放,但每次我再次捏时,模型会自行重置。

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,所以我觉得这很奇怪。有人能解释一下这个原因吗?

2 个答案:

答案 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);
        }
    }
}