我有一个SCNCamera场景设置,可以围绕一个对象旋转。
限制相机围绕物体旋转的最佳方式是什么?
示例:除了能够围绕整个球体旋转之外,我如何将旋转限制为单个半球?
我的第一个尝试是查看.allowsCameraControl是否存在任何限制。找不到任何东西。
然后,我尝试使用c#Unity:鼠标轨道脚本,不走运。
关于如何解决或解决此问题的一些指示将非常有用。
var lastWidthRatio: Float = 0 var lastHeightRatio: Float = 0 let camera = SCNCamera() let cameraNode = SCNNode() let cameraOrbit = SCNNode() override func viewDidLoad() { super.viewDidLoad() // create a new scene let scene = SCNScene(named: "art.scnassets/ship.scn")! // create and add a camera to the scene camera.usesOrthographicProjection = true camera.orthographicScale = 9 camera.zNear = 0 camera.zFar = 100 cameraNode.position = SCNVector3(x: 0, y: 0, z: 50) cameraNode.camera = camera cameraOrbit.addChildNode(cameraNode) scene.rootNode.addChildNode(cameraOrbit) // retrieve the ship node let ship = scene.rootNode.childNodeWithName("ship", recursively: true)! // retrieve the SCNView let scnView = self.view as! SCNView // set the scene to the view scnView.scene = scene // add a tap gesture recognizer let gesture = UIPanGestureRecognizer(target: self, action: "panDetected:"); scnView.addGestureRecognizer(gesture); } func panDetected(sender: UIPanGestureRecognizer) { let translation = sender.translationInView(sender.view!) let widthRatio = Float(translation.x) / Float(sender.view!.frame.size.width) + lastWidthRatio let heightRatio = Float(translation.y) / Float(sender.view!.frame.size.height) + lastHeightRatio self.cameraOrbit.eulerAngles.y = Float(-2 * M_PI) * widthRatio self.cameraOrbit.eulerAngles.x = Float(-M_PI) * heightRatio print(Float(-2 * M_PI) * widthRatio) if (sender.state == .Ended) { lastWidthRatio = widthRatio % 1 lastHeightRatio = heightRatio % 1 } }
您似乎就快要到了,仅使用您引用的答案中的@Rickster代码。
您可以进行的更改将在以下几行中:
self.cameraOrbit.eulerAngles.y = Float(-2 * M_PI) * widthRatio self.cameraOrbit.eulerAngles.x = Float(-M_PI) * heightRatio
隐含地允许俯仰和偏航覆盖整个球体。那是您可以进行限制的地方。例如eulerAngles.x,您可以执行以下操作,而不是让音高()从0到-π变化
eulerAngles.x
self.cameraOrbit.eulerAngles.x = Float(-M_PI_2) + Float(-M_PI_2) * heightRatio
使用全屏垂直滚动覆盖该范围,可以在-π/ 2和-π之间平滑地变化。或者,您可以在这两行中设置严格的最小/最大限制/检查,以约束到地球的特定区域。
(编辑以解决惯性注释)
对于旋转阻尼或惯性,我会使用内置的SceneKit Physics进行处理,并可能将相机放在不可见(无几何形状)的SCNNode上。该相机节点变成了一个万向节,类似于本项目中采用的方法:一个完全由RubyMotion和SceneKit创建的交互式七英尺地球仪。
然后,虚拟万向节将SCNPhysicsBody带有some(您添加,默认情况下不附带一个)damping。或者,也许您将物理场放在中心对象上,然后给该对象一些东西angularDamping。
SCNPhysicsBody
damping
angularDamping