Cálculo de sum de ángulo relativa 3D

Tengo un objeto 3D con rotación r1 en forma de cuaternión. Lo giro con angularjs euler locales:

transform.Rotate(new Vector3(0f, 15f, 0f), relativeTo: Space.Self); // right transform.Rotate(new Vector3(-10f, -5f, 0f), relativeTo: Space.Self); // left up transform.Rotate(new Vector3(0f, 0f, 90f), relativeTo: Space.Self); // 90 clockwise 

Ahora tengo rotación r2 . ¿Cómo puedo recuperar la sum de rotación Y local 15-5 + 0 = 10 si no sé qué angularjs se han aplicado? Puede ser imposible obtener exactamente ese valor (10) pero ya entendiste mi idea. ¿Puedo ser que puedo obtener Y diff en el espacio r2 local?

Una posible solución que encontré:

  (r2 * Quaternion.Inverse(r1)).eulerAngles.Y 

Todavía estoy convencido de que las matrices de transformación serán un enfoque mucho mejor para ti

  • como se mencionó en la pregunta anterior
  • Los angularjs de Euler no son los mejores para su propósito y solo ensucian para usted
  • pero de todos modos, ¿qué hay de esto?

     P0=(0,0,0) P1=(1,0,0) // or (0,0,1) y=0 !!! A0=r2_localtoglobal(P0) A1=r2_localtoglobal(P1) B0=r2r1_localtoglobal(P0) B1=r2r1_localtoglobal(P1) A=A1-A0 // local r2 X axis direction in GCS (without r1) B=B1-B0 // local r2r1 X axis direction in GCS (with r1) angle=-acos((AB)/(|A|.|B|)) // angle between A,B (but inverted because you wanted local angle) 
  • Supongo que r1 es ship y r2 es radar

[Editar1] después de leer de su edición de la pregunta vinculada finalmente está claro lo que quiere

 P0=(0,0,0) P1=(1,0,0) // or (0,0,1) y=0 !!! A0=r1_globaltolocal(P0) A1=r1_globaltolocal(P1) A=A1-A0 angle=atanxy(Ax,Az) 
  • donde r1 es su transformación de barco
  • la transformación de radar es irrelevante para la imagen de fondo
  • atanxy es atan2 = atan (y / x) pero con la descomposición del signo, por lo que funciona en un intervalo <0,2PI> completo

atan2, atanxy:

 const double pi=M_PI; const double pi2=2.0*M_PI; double atanxy(double x,double y) // atan2 return < 0 , 2.0*M_PI > { int sx,sy; double a; const double _zero=1.0e-30; sx=0; if (x< -_zero) sx=-1; if (x>+_zero) sx=+1; sy=0; if (y< -_zero) sy=-1; if (y>+_zero) sy=+1; if ((sy==0)&&(sx==0)) return 0; if ((sx==0)&&(sy> 0)) return 0.5*pi; if ((sx==0)&&(sy< 0)) return 1.5*pi; if ((sy==0)&&(sx> 0)) return 0; if ((sy==0)&&(sx< 0)) return pi; a=y/x; if (a<0) a=-a; a=atan(a); if ((x>0)&&(y>0)) a=a; if ((x<0)&&(y>0)) a=pi-a; if ((x<0)&&(y<0)) a=pi+a; if ((x>0)&&(y<0)) a=pi2-a; return a; }