[c#] Calcolo della somma angolare relativa 3D



Answers

Sono ancora convinto che le matrici di trasformazione saranno un approccio molto migliore per te

  • come menzionato nella domanda precedente
  • Gli angoli di Eulero non sono i migliori per il tuo scopo e fanno solo casino per te
  • ma comunque che dire di questo?

    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((A.B)/(|A|.|B|)) // angle between A,B (but inverted because you wanted local angle)
  • Presumo che r1 sia nave e r2 sia radar

[Modifica1] dopo aver letto la tua modifica dalla domanda collegata è finalmente chiaro quello che vuoi

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(A.x,A.z)
  • dove r1 è la tua trasformazione navale
  • la trasformazione radar è irrilevante per l'immagine di sfondo
  • atanxy è atan2 = atan (y / x) ma con la decomposizione del segno quindi funziona su un intero intervallo <0,2PI>

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;
        }
Question

Ho un oggetto 3D con rotazione r1 in una forma di quaternion. Lo ruoto con gli angoli euler locali:

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

Ora ho rotazione r2 . Come posso recuperare la somma di rotazione Y locale 15-5 + 0 = 10 se non so quali angoli sono stati applicati? Potrebbe essere impossibile ottenere esattamente quel valore (10) ma hai la mia idea. Posso essere in grado di ottenere Y diff nello spazio locale r2 ?




Links