SceneKit - 向通过平移手势旋转的球体添加漂移

时间:2016-05-16 20:29:42

标签: ios scenekit

我正在使用SceneKit并允许用户使用平移手势旋转他们在球体内看到的内容。这样做很好 - 除了,我想让球体在摇动手势的方向上保持稍微旋转,感觉有点反应。

这是我对场景的设置:

    // Create scene
    let scene = SCNScene()

    sceneView.scene = scene

    let panRecognizer = UIPanGestureRecognizer(target: self,
                                               action: #selector(ViewController.handlePanGesture(_:)))

    sceneView.addGestureRecognizer(panRecognizer)

    //Create sphere
    let sphere = SCNSphere(radius: 50.0)

    // sphere setup

    sphereNode = SCNNode(geometry: sphere)

    sphereNode!.position = SCNVector3Make(0,0,0)
    scene.rootNode.addChildNode(sphereNode!)

    // Create camera
    let camera = SCNCamera()

    // camera setup

    cameraNode = SCNNode()

    cameraNode!.camera = camera
    cameraNode!.position = SCNVector3Make(0, 0, 0)

    cameraOrbit = SCNNode()

    cameraOrbit!.addChildNode(cameraNode!)
    scene.rootNode.addChildNode(cameraOrbit!)

    let lookAtConstraint = SCNLookAtConstraint(target: sphereNode!)
    lookAtConstraint.gimbalLockEnabled = true
    cameraNode!.constraints = [lookAtConstraint]

    sceneView.pointOfView = cameraNode

以下是平移手势目前的处理方式(由SCNCamera limit arcball rotation提供):

    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

    if (sender.state == .Ended) {
        lastWidthRatio = widthRatio
        lastHeightRatio = heightRatio
    }

我不知道从哪里开始添加轻微的连续旋转动作。也许添加physicsBody并使用武力?也许动画eulerAngles的变化?

1 个答案:

答案 0 :(得分:4)

我之前处理过类似事情的方法是将手势处理程序拆分为手势状态开始,更改和结束的部分。如果轮换对您有效,您需要做的就是在if (sender.state == .Ended)语句的底部添加代码。

lastHeightRatio = heightRatio之后,您可以使用sender.velocityInView(sender.view!)在视图中找到平移的速度,然后像以前一样找到水平分量,然后添加SCNAction以使用{旋转节点{1}}计时模式。

您可能需要一个乘数来将视图中的速度(以点为单位)转换为您希望旋转的角度(以弧度为单位)。 10点的速度相对较小,将导致非常快的旋转。

如果您想要触摸来停止剩余旋转,那么当手势再次开始时,您还需要从节点中删除所有操作。

一些样本代码将是:

EaseOut

这应该足以让你入门。