SceneKit:在 Swift 4 中缩放相机

Posted

技术标签:

【中文标题】SceneKit:在 Swift 4 中缩放相机【英文标题】:SceneKit: Zooming a camera in 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 中我用什么来实现这一点?

【问题讨论】:

【参考方案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
  

【讨论】:

以上是关于SceneKit:在 Swift 4 中缩放相机的主要内容,如果未能解决你的问题,请参考以下文章

在 SceneKit 中禁用相机平移

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

如何确保 SceneKit 相机始终指向特定位置

在 SceneKit 中缩放 SCNNode

Swift 3 - SceneKit 获取 3d 模型比例值

在 Scenekit 中移动相机