Ориентация SCNNode вместо eulerAngles - PullRequest
1 голос
/ 19 апреля 2019

Я пытаюсь повернуть SCNNode с UIRotationGestureRecognizer и изменить eulerAngles.Я переключаюсь между вращением вокруг y и вокруг z оси.Когда я вращаю только один из них, все в порядке.Но проблема возникает, когда я вращаю оба.Он больше не вращается вокруг самой оси, но вращается случайно.

Я прочитал много ответов, особенно от ARGeo, например: Ось Z-вращения SCNNode остается постоянной, в то время как оси X и Y меняются при повороте узла , и я понимаю проблему eulerAngles и карданный замок.

Но я не понимаю, как правильно использовать orientation муравей w компонента.Здесь кто-то, кто успешно использовал UIRotationGestureRecognizer и orientation вместо eulerAngles?

1 Ответ

1 голос
/ 19 апреля 2019

Вот один из примеров, как реализовать UIRotationGestureRecognizer.

Я скопировал его с Как я могу повернуть SCNNode .... ТАК.

private var startingOrientation = GLKQuaternion.identity
private var rotationAxis = GLKVector3Make(0, 0, 0)

@objc private func handleRotation(_ rotation: UIRotationGestureRecognizer) {
    guard let node = sceneView.hitTest(rotation.location(in: sceneView), options: nil).first?.node else {
        return
    }
    if rotation.state == .began {
        startingOrientation = GLKQuaternion(boxNode.orientation)
        let cameraLookingDirection = sceneView.pointOfView!.parentFront
        let cameraLookingDirectionInTargetNodesReference = boxNode.convertVector(cameraLookingDirection,                                                                        
                                                                                 from: sceneView.pointOfView!.parent!)
        rotationAxis = GLKVector3(cameraLookingDirectionInTargetNodesReference)
    } else if rotation.state == .ended {
        startingOrientation = GLKQuaternionIdentity
        rotationAxis = GLKVector3Make(0, 0, 0)
    } else if rotation.state == .changed {
        let quaternion = GLKQuaternion(angle: Float(rotation.rotation), axis: rotationAxis)
        node.orientation = SCNQuaternion((startingOrientation * quaternion).normalized())
    }
}

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

...