在ARkit中旋转对象

时间:2018-05-16 10:24:39

标签: ios objective-c uigesturerecognizer arkit

我的场景中有一个物体,当我在屏幕上移动手指时,我希望物体朝那个方向旋转。它是屏幕上的一个杯子,我的手指在屏幕上滑动应该围绕中心点旋转立方体,但不要移动杯子的位置。它应该只在它们主动滑动时旋转

1 个答案:

答案 0 :(得分:3)

旋转SCNNode是一项相当简单的任务。

您应该首先创建一个变量来将rotationAngle存储在YAxis或您希望执行旋转的任何其他任何内容上,例如:

var currentAngleY: Float = 0.0

您还需要有一些方法来检测您要旋转的节点,在本例中我们将调用currentNode,例如。

var currentNode: SCNNode!

在这个例子中,我将围绕YAxis旋转。

如果您想使用UIPanGestureRecognizer,可以这样做:

/// Rotates An Object On It's YAxis
///
/// - Parameter gesture: UIPanGestureRecognizer
@objc func rotateObject(_ gesture: UIPanGestureRecognizer) {

    guard let nodeToRotate = currentNode else { return }

    let translation = gesture.translation(in: gesture.view!)
    var newAngleY = (Float)(translation.x)*(Float)(Double.pi)/180.0
    newAngleY += currentAngleY

    nodeToRotate.eulerAngles.y = newAngleY

    if(gesture.state == .ended) { currentAngleY = newAngleY }

    print(nodeToRotate.eulerAngles)
}

或者,如果您想使用UIRotationGesture,可以执行以下操作:

/// Rotates An SCNNode Around It's YAxis
///
/// - Parameter gesture: UIRotationGestureRecognizer
@objc func rotateNode(_ gesture: UIRotationGestureRecognizer){

//1. Get The Current Rotation From The Gesture
let rotation = Float(gesture.rotation)

//2. If The Gesture State Has Changed Set The Nodes EulerAngles.y
if gesture.state == .changed{

    currentNode.eulerAngles.y = currentAngleY + rotation
}

//3. If The Gesture Has Ended Store The Last Angle Of The Cube
if(gesture.state == .ended) {
    currentAngleY = currentNode.eulerAngles.y

 }
}

希望它有所帮助...