【问题标题】:SceneKit: Zooming a camera in Swift 4SceneKit:在 Swift 4 中缩放相机
【发布时间】:2018-07-18 20:48:58
【问题描述】:

在 swift 2 中,您可以使用 cameraNode.camera!xFovyFov 属性来放大和缩小相机。但它们在 Swift 3 中已被弃用。

我可以使用此代码调整相机的 z 位置。 . .

@objc func zoom(gesture: UIPinchGestureRecognizer) {
    let view = self.view as! SCNView
    let node = view.scene!.rootNode.childNode(withName: "Camera", recursively: false)
    let scale = gesture.scale

    switch gesture.state {
    case .began:
        break
    case .changed:
        node!.position.z = node!.position.z - Float(scale)
        break
    default: break
    }
}

。 . .但是改变z位置并没有做任何事情。在 Swift 4 中我用什么来实现这一点?

【问题讨论】:

    标签: swift camera scenekit


    【解决方案1】:

    实际上,缩放非常简单。

    @objc func zoom(gesture: UIPinchGestureRecognizer) {
        let view = self.view as! SCNView
        let node = view.scene!.rootNode.childNode(withName: "Camera", recursively: false)
        let scale = gesture.velocity
    
        switch gesture.state {
        case .began:
            break
        case .changed:
            node!.camera!.fieldOfView = node!.camera!.fieldOfView - CGFloat(scale)
            print(node!.camera!.fieldOfView)
            break
        default: break
        }
    }
    

    当然,这确实有它的问题。它将继续放大和缩小,没有任何限制。但这可以通过更多代码轻松解决

    -编辑-

    砰!并通过一些快速的if-statements 对缩放进行了一些限制。

    @objc func zoom(gesture: UIPinchGestureRecognizer) {
        let view = self.view as! SCNView
        let node = view.scene!.rootNode.childNode(withName: "Camera", recursively: false)
        let scale = gesture.velocity
    
        let maximumFOV:CGFloat = 25 //This is what determines the farthest point you can zoom in to
        let minimumFOV:CGFloat = 90 //This is what determines the farthest point you can zoom out to
    
        switch gesture.state {
        case .began:
            break
        case .changed:
            node!.camera!.fieldOfView = node!.camera!.fieldOfView - CGFloat(scale)
            if node!.camera!.fieldOfView <= maximumFOV {
                node!.camera!.fieldOfView = maximumFOV
            }
            if node!.camera!.fieldOfView >= minimumFOV {
                node!.camera!.fieldOfView = minimumFOV
            }
            break
        default: break
        }
    }
    

    maximumFOV 越低,放大越近。越高,放大越小。minimumFOV 越高,缩小越远。越低,缩小的越少。

    【讨论】:

      【解决方案2】:

      您还可以使用带有钳位扩展的ClosedRange 将缩放钳位在两个值之间。

      @objc func handleZoom(recognizer: UIPinchGestureRecognizer) {
        switch recognizer.state {
          case .began:
            break
          case .changed:
            let scaleRange: ClosedRange = Double(2)...Double(14)
            let currentScale = cameraNode.camera?.orthographicScale
            let scale = recognizer.velocity
            let newScale = currentScale! - Double(scale)
            let clampedScale = scaleRange.clamp(newScale)
            cameraNode.camera?.orthographicScale = clampedScale
            break
          default: break
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2019-08-03
        • 2014-03-21
        • 2018-08-19
        • 2016-03-25
        • 2018-03-06
        • 2019-03-29
        • 2017-03-28
        • 2014-09-11
        • 2014-10-30
        相关资源
        最近更新 更多