微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

swift – SCNCamera限制弧形旋转

我有一个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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐