ios - SceneKit 相机节点在捏手势时重置

标签 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 还是个新手,所以我觉得这很奇怪。谁能解释一下这是什么原因?

最佳答案

你很接近,逻辑有点不对。

开始的情况很好,您需要“记住”收缩开始时的比例,这可能是您上次缩放时设置的比例。

您更改的案例有两个问题。

  • 您计算的比例 startScale = Double(100/zoom) 仅基于手势识别器比例,该比例仅适用于当前捏合(因此每次捏合都会重置)。这需要基于 GR 等级,以及在捏合开始时“记住”的等级。
  • 您还将更改后的大小写中的 startScale 重置为您的新值。这给出了“指数”类型的缩放效果;你不想要这个。

结束的案例只需要设置缩放值,这样我们就可以记住下一次捏合要从什么开始。在这种情况下,它可能有点多余,您可以使用 startScale = startScale * zoom 而在开始的情况下什么也没有。

尚未测试以下内容,但希望它能给您一些想法。您传递给 zoom 函数的值实际上是一个视野角度,因此我将其重命名以区别于各种比例。 FOV 将在 30-60 度左右,而尺度更像是在 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
        }
    }
}

关于ios - SceneKit 相机节点在捏手势时重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38599796/

相关文章:

ios - 用于将图像加载到 Cell 的 NSOperation - 崩溃

swift - 将 Swift uuid_t 传递给 C 函数

swift - 如何从 bundle 而不是下载中设置kml的图标样式

ios - 带有 MKMapKit 的 Swift GestureRecognizers - 放下图钉并拖动

ios - NSUndomanager 更改是否在使用 CoreData 的启动之间持续存在

ios - 停止 Segue 并传递到下一个查看警报中显示的文本字段的内容 - Swift

ios - 具有超过 8 个值的 NS_OPTIONS

ios - UITableView 部分标题与 UITableviewCell 重叠并且没有背景色

ios - 如何找到特定帧大小的所有 subview ?

iphone - 拖动图像时,请勿将图像移出屏幕