вращать объект в ARkit - PullRequest
0 голосов
/ 16 мая 2018

В моей сцене есть объект, который, когда я перемещаю палец по экрану, я хочу, чтобы объект вращался в этом направлении.Это чашка на экране, и скольжение пальца по экрану должно вращать куб вокруг центральной точки, но не перемещать положение чашки.Он должен вращаться только до тех пор, пока они активно смахивают

1 Ответ

0 голосов
/ 16 мая 2018

Поворот SCNNode - довольно простая задача.

Вы должны начать с создания переменной для хранения угла поворота вокруг оси YA или любого другого, для которого вы хотите выполнить вращение, например:

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

 }
}

Надеюсь, это поможет ...

...