[swift]SceneKit 相机节点上 pinch 手势将重置

发布时间: 2017/3/6 23:28:58
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我试图实现 pinch 手势变焦,然而每次我捏第二次,模型重置本身。

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,还是新的所以这样奇怪。有人能解释这个原因吗?

解决方法 1:

你近在咫尺,逻辑有点古怪。

开始情况很好,你需要记住规模的捏创办,这可能是成立您放大的最后一次的规模。

您已更改的情况下有两个问题。

  • 你计算规模 startScale = Double(100/zoom) 基于只有在手势识别器尺度上,这种规模是仅为当前捏 (因此是为每个夹点重置)。这需要基于 GR 的规模,而规模 '记住' 捏开头。
  • 你也重置 startScale 在改变案件到你新的价值。这给指数型缩放效果;你不想这样。

已结束的情况下只需要设置的缩放值,这样我们就能记住什么开始下一捏。在这种情况下它可能有点多余和你可能侥幸 startScale = startScale * zoom ,只是没有开始案例。

还没有测试过下面,但我希望它给你一些想法。你传入的值 zoom func 是实际视场角,所以我已改名为这来区分不同的尺度。视场将 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
        }
    }
}
官方微信
官方QQ群
31647020