Me encontré con esta pregunta de desbordamiento de pila titulada ¿ Conversión adecuada entre cuaterniones y coordenadas de rotación esférica? pero probando el código, el resultado no igualó mis predicciones. Mi pregunta es, ¿qué hice mal?
Necesito convertir cuaterniones (x, y, z, w) en coordenadas esféricas (1, ϑ, φ). Encontré un par de soluciones en línea, pero ninguna parece dar los valores correctos cuando lo pruebo en el código. Lo que intenté fue convertir los cuaterniones en una representación de eje-ángulo, luego calcular trigonométricamente ϑ y φ como se muestra aquí . Mi borrador de python se parece a esto:
def quaternion_to_spherical(qx, qy, qz, qw): angle_cos = qw angle_sin = math.sqrt(1 - math.pow(angle_cos, 2)) angle = 2 * math.acos(qw) if angle_sin < 0.001: angle_sin = 1 ax = qx / angle_sin ay = qy / angle_sin az = qz / angle_sin theta = -math.asin(ay) if math.pow(ax, 2) + math.pow(az, 2) < 0.001: phi = 0 else: phi = math.atan2(ax, az) if phi < 0: phi = phi + math.pi * 2 print("Theta: " + str(theta) + "\tPhi: " + str(phi))Sin embargo, los resultados predefinidos no coinciden del todo. Deben ser como sigue, con el resultado debajo:
Quaternion: [0.707, 0, 0, 0.707] Result: Theta: -0.0 Phi: 1.5707963267948966 Predicted: Theta: 𝜋/2 Phi: 3𝜋/4 Quaternion: [0, 0.707, 0, 0.707] Result: Theta: -1.5707963118937354 Phi: 0 Predicted: Theta: 𝜋/2 Phi: 0 Quaternion: [0, 0, 0.707, 0.707] Result: Theta: -0.0 Phi: 0.0 Predicted: Theta: 0 Phi: 𝜋/2 or 0¿Alguna idea de por qué estos valores son incorrectos? Según tengo entendido, no hay errores en el código. ¿Las matemáticas son incorrectas o mis predicciones son incorrectas?
Si le importa la razón por la que estoy haciendo esto, aquí viene: me gustaría aplicar matrices de rotación de 2x2 con números complejos a objetos 3D en Unity. El plan es separar las matemáticas, que se toman de la literatura sobre esferas de bloque, de las rotaciones de cuaterniones de Unity. La conversión que estoy haciendo aquí es la interfaz entre Unity y las operaciones matemáticas.