Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Lios Con Los Angulos...

Iniciado por Lord Trancos 2, 19 de Enero de 2005, 10:00:06 PM

« anterior - próximo »

Lord Trancos 2

 Veamos.... tengo un par de monigotes en un escenario. Su posicion viene definida por un vector y ademas tienen un angulo de rotacion Y.

Lo que quiero; es que un monigote se encare al otro. Asi de simple.

Pero me estoy volviendo loco con el tema de los angulos...

Esta es la funcion que intento usar...


function YRotationFacingTo(var _source_rot: single; _speed: single;
                          _source_pos, _target_pos: PVector;
                          _lastFrameTime: cardinal): single;

var
 _v1, _v2 : TVector;
 _vA, _vB, _vC : TVector;
 _rot, _sin : single;

begin
 // convertimos la rotacion en radianes
 _rot := DegToRad(_source_rot);

 // anulamos el eje Y de las 2 posiciones
 _v1 := _source_pos^;
 _v1[1] := 0;
 _v2 := _target_pos^;
 _v2[1] := 0;

 // el primer vector para el producto vectorial
 // lo saco de la rotacion del objeto que quiero encarar
 _vA[0] := -sin(_rot);   // opengl friendly
 _vA[1] := 0;
 _vA[2] := -cos(_rot);  // opengl friendly

 // el segundo vector lo saco de restar la posicion
 // del objeto B (destino) a la posicion del objeto
 // que quiero orientar; y lo normalizo.
 _vB  := VECTOR_Normalize(VECTOR_SubV(_v2, _v1));

 // calculo el producto vectorial
 _vC  := VECTOR_Cross(_vA, _vB);

 // [el modulo del producto vectorial = modulo A * modulo B * seno angulo]
 // como el modulo de A y B es 1; tenemos q [el modulo del producto vectorial = seno angulo]
 // como el producto vectorial es perpendicular al plano XZ; pillo directamente
 // el valor de Y como modulo; osea como seno del angulo
 Result := _vC[1]; // sin = angle = module = Y

 // no se que mas hacer....

end;


osea.... me quedo con el seno del angulo que forma el monigote A respecto a la
posicion del monigote B.

el problema es que cuando el monigote B esta a las 4 (reloj) del monigote A; el seno
es el mismo que cuando el monigote B esta a las 2 del monigote A  ...   O_O;
y claro... asi no hay quien sepa el angulo..... -_-;;;

en fin cualquier ayudita es bien recibida... soy muy torpe con las mates  (nooo) y llevo media tarde con esto....
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

sés

 Aquí tienes la función que uso yo en mi avatar ^_^:
_global.ang2p = function( a, b ) {
var x = b.x - a.x;
var y = a.y - b.y;
return Math.atan2( x, y ) * 180.0 / Math.PI;
}

Lo da en grados, pero con quitar * 180.0 / Math.PI lo tienes en radianes.

Aquí tienes otra en Java:
public static double ang_2p(Point a, Point b) {
    Point p = new Point(b.x - a.x, b.y - a.y);
    double ang = Math.atan2((double) p.x, (double) p.y);
    return ang < 0.0 ? ang + (2.0 * Math.PI) : ang;
}
Soy indeciso... ¿o no?

Zaelsius

 Aaaaah.. esa olvidada función arcotangente  :rolleyes: (yo tampoco me acordaba la verdad)

¿Y esta modificación serviria?


 _vB  := VECTOR_Normalize(VECTOR_SubV(_v2, _v1));

// calculo el producto vectorial
_vC  := VECTOR_Cross(_vA, _vB);

......

Result := _vC[1]; // sin = angle = module = Y

if ( _vC[0] < 0 ) Result := "180 grados" - Result;


Lord Trancos 2

 Gracias ses!  (uoh)
Funciona de lujo.

ZaelSiuS, eso no funciona. Pero asias de todos modos ;)
El problema de usar el producto vectorial es que del seno (y del coseno) de un angulo no puedes sacar el angulo en cuestion; ya que hay dos posibilidades. Ejemplo: el seno de 45º = el seno de 135º.
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

Zaelsius

 Sí.. creo que debí haber puesto _VB en vez de _VC, para comprobar el signo de las X's y entonces elegir la otra posibilidad que da el seno.. en fin

Cómo se nota que estamos de exámenes!!  (uoh)