我有一个SCNCamera的场景设置,围绕一个对象旋转.
限制相机在物体周围可以实现的旋转范围的最佳方法是什么?
示例:如何围绕整个球体旋转,如何限制旋转到单个半球?
我的第一次尝试是查看.allowsCameraControl是否有任何夹子.找不到任何东西.
然后我尝试调整c#Unity:mouse orbit script,没有运气.
关于如何处理或解决这个问题的一些指示很好.
由于this answer.,Boilerplate Arcball
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变化
到-π,你可以做到
self.cameraOrbit.eulerAngles.x = Float(-M_PI_2) + Float(-M_PI_2) * heightRatio
使用全屏幕在-π/ 2和-π之间平滑变化
垂直滚动以覆盖该范围.或者你可以把
硬限制/最大限制/检查这两行限制
到地球的某个特定区域.
对于旋转阻尼或惯性,我会使用内置的SceneKit Physics接近它,并且可能将摄像机置于不可见(无几何)的SCNNode上.该摄像机节点变为万向节,类似于该项目中采用的方法:An interactive seven-foot globe created entirely in RubyMotion and SceneKit.
然后虚拟万向节得到一个SCNPhysicsBody(你添加它,默认情况下没有一个)带有一些阻尼.或者您可能将物理放在中心对象上,并为该对象提供一些angularDamping.