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)  






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.