SceneKit:在 Swift 4 中缩放相机
Posted
技术标签:
【中文标题】SceneKit:在 Swift 4 中缩放相机【英文标题】:SceneKit: Zooming a camera in Swift 4 【发布时间】:2018-07-18 20:48:58 【问题描述】:在 swift 2 中,您可以使用 cameraNode.camera!
的 xFov
和 yFov
属性来放大和缩小相机。但它们在 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 中缩放相机的主要内容,如果未能解决你的问题,请参考以下文章