2
我正在試圖製作一個圍繞物體旋轉的相機。因此相機應該連接到一個球體。對於我發現這堆在那裏的傢伙解釋瞭如何做一個設置:Rotate SCNCamera node looking at an object around an imaginary sphereSceneKit相機圍繞物體旋轉
我的問題是相機的Z軸。我可以繞X軸和Y旋轉,但不在身邊Z.
這裏是我的代碼:
class SceneManager
{
private let scene: SCNScene
private let view: SCNView
private let cameraOrbit: SCNNode
private var cameraOrbitLastRatioWidth: Float = 0
private var cameraOrbitLastRatioHeight: Float = 0.2
private var maxWidthRatioRight: Float = 0.2
private var maxWidthRatioLeft: Float = -0.2
private var maxHeightRatioXDown: Float = 0.02
private var maxHeightRatioXUp: Float = 0.4
init(view: SCNView, assetFolder: String, sceneName: String, cameraName: String, backgroundColor: UIColor) {
self.view = view
self.scene = SCNScene(named: (assetFolder + "/" + sceneName))!
self.view.pointOfView = self.scene.rootNode.childNodeWithName(cameraName, recursively: true)
if self.view.pointOfView == nil {
print("Error: Inexistent camera specified in init SceneManager")
exit(1)
}
self.cameraOrbit = SCNNode()
self.cameraOrbit.addChildNode(self.view.pointOfView!)
self.scene.rootNode.addChildNode(self.cameraOrbit)
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(panHandler(_:)))
panGesture.maximumNumberOfTouches = 1
self.view.allowsCameraControl = false
self.view.addGestureRecognizer(panGesture)
self.view.backgroundColor = backgroundColor
self.view.scene = self.scene
}
@objc private func panHandler(sender: UIPanGestureRecognizer) {
let translation = sender.translationInView(sender.view!)
let ratioWidth = Float(translation.x)/Float(sender.view!.frame.size.width) + self.cameraOrbitLastRatioWidth
let ratioHeight = Float(translation.y)/Float(sender.view!.frame.size.height) + self.cameraOrbitLastRatioHeight
if (sender.state == UIGestureRecognizerState.Changed) {
if self.cameraOrbitLastRatioWidth >= maxHeightRatioXUp {
self.cameraOrbitLastRatioWidth = maxHeightRatioXUp
}
if self.cameraOrbitLastRatioWidth <= maxHeightRatioXDown {
self.cameraOrbitLastRatioWidth = maxHeightRatioXDown
}
if self.cameraOrbitLastRatioHeight >= maxWidthRatioRight {
self.cameraOrbitLastRatioHeight = maxWidthRatioRight
}
if self.cameraOrbitLastRatioHeight <= maxWidthRatioLeft {
self.cameraOrbitLastRatioHeight = maxWidthRatioLeft
}
self.cameraOrbit.eulerAngles.y -= Float(M_PI_4 * 3) * ratioWidth
self.cameraOrbit.eulerAngles.x -= Float(M_PI_4) * ratioHeight
}
if (sender.state == UIGestureRecognizerState.Ended) {
self.cameraOrbitLastRatioWidth = ratioWidth
self.cameraOrbitLastRatioHeight = ratioHeight
}
}
}
如果任何人有一個想法,那將是非常歡迎;-)