Прежде всего, я чувствую, что этот вопрос довольно прост, и мне просто не хватает некоторых математических знаний, такое чувство, что формула могла бы дать мне ответ, однако я нигде не могу его найти.
Я пытаюсь найти способ вычисления угла оси Y между ARCamera
и World Origin
.
Сначала я подумал, что могу использовать SCNNode
и его свойство eulerAngles
следующим образом:
let node = SCNNode()
node.transform = sceneView.pointOfView!.camera.worldTransform
print(node.eulerAngles.y) // Angle given is always between [-π/2, π/2]
Это объясняется чуть более подробно здесь: ScenKit eulerОтключает странные значения во время вращения
Я также знаю, что у узла есть свойство rotation
, которое является ненормализованным кватернионом, и что вращение по оси Y также можно выполнить, одновременно поворачивая оси X и Z.
Есть ли способ получить угол от начала координат мира до -z
камеры, используя свойства transform
, rotation
или orientation
?
Кажется, что то, что я ищу, будет быстрой реализацией функции Unity Vector3.SignedAngle: https://docs.unity3d.com/ScriptReference/Vector3.SignedAngle.html
Vector3 targetDir = target.position - transform.position;
Vector3 forward = transform.forward;
float angle = Vector3.SignedAngle(targetDir, forward, Vector3.up);
if (angle < -5.0F)
print("turn left");
else if (angle > 5.0F)
print("turn right");
else
print("forward");
Так что, если у кого-то есть идея о том, как это реализовать, пожалуйста, дайте мне знать.