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....
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;
}
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;
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º.
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)