SCNNode ApplyTorque в соответствии с силами - PullRequest
0 голосов
/ 28 ноября 2018

Предполагая, X-Axis является up-down;Y-Axis равно left-right;Z-Axis - это depth.(Это кажется странным, но я имел опыт работы с ARKit. Он просто меняет "нормальный" X-Axis и Y-Axis.

У меня есть SCNNode, называемый node1расположен на (0, 0, 0). Он имеет прямоугольную форму с портретной раскладкой.

Приведенный ниже код позволяет узлу следить за телефоном, когда я вызываю метод lookNode1().

//Method to make node follow the camera when I call it.
@objc func lookNode1() {
    if(self.node1 != nil) {
        //Look at the camera
        self.node1.look(at: self.sceneView.pointOfView!.position)

        //I have to flip it 90 degrees because the node is created in a fancy way that I have to update for. 
        let startingOrientation = GLKQuaternion(self.node1.orientation)
        let node1LookingDirection = self.node1.parentUp
        let node1LookingDirectionInTargetNodesReference = self.node1.convertVector(node1LookingDirection,                                                                    from: self.sceneView.pointOfView?.parent!)

        let rotationAxis = GLKVector3(node1LookingDirectionInTargetNodesReference)

        let quaternion = GLKQuaternion(angle: Float(Double.pi/2), axis: rotationAxis)

        self.node1.orientation = SCNQuaternion((startingOrientation * quaternion).normalized())
    }
}

extension SCNNode {
    /// The local unit Y axis (0, 1, 0) in parent space.
    var parentUp: SCNVector3 {

        let transform = self.transform
        return SCNVector3(transform.m21, transform.m22, transform.m23)
    } 
}

Однако у меня проблема в том, что ось Z относительно телефона, а не точная ось Z, неверна. Мой вопрос: Представьте себе сферу вокруг node, Как я могу получить ее там, гдеверхняя часть прямоугольника всегда ориентирована на Северный полюс?

Мой node1 никогда не двигается, он просто вращается, чтобы следовать за камерой. Но мне нужна ось Z относительно камеры, этовсегда в портретном режиме. Независимо от того, находится ли камера в альбомной ориентации или ее вариациях.

Rectangle Celestial Circle

Усилия:

Я думал о том, чтобы применить некоторую гравитацию к A так, чтобы она всегда была сверху, то есть pointiнг к вершине сферы, окружающей узел.Тем не менее, 1) Не уверен, как это применить, и 2) Не уверен, что это будет работать.

Я знаю, что у нас есть func applyTorque(_ torque: SCNVector4, asImpulse impulse: Bool), и я мог бы сделать self.node1.physicsBody.applyTorque(SCNVector4(0, 0, 1, someRotation), asImpluse: true)), однако я не уверен, что это будет за someRotation.Как бы я применил это к гравитационному полю с Северного полюса (1, 0, 0) (при том, что X вверх-вниз)?То есть изображение выше.

...