Предполагая, 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 относительно камеры, этовсегда в портретном режиме. Независимо от того, находится ли камера в альбомной ориентации или ее вариациях.
Усилия:
Я думал о том, чтобы применить некоторую гравитацию к 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 вверх-вниз)?То есть изображение выше.