suma poligono para internos interiores exteriores ejercicios calcular angulos c# math unity3d euler-angles

c# - para - suma de angulos interiores de un poligono



Cálculo de suma de ángulo relativa 3D (2)

Tengo un objeto 3D con rotación r1 en forma de cuaternión. Lo giro con ángulos 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 suma de rotación Y local 15-5 + 0 = 10 si no sé qué ángulos 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 ángulos 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((A.B)/(|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(A.x,A.z)

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