Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: The-Force en 03 de Octubre de 2005, 06:36:11 PM

Título: Rotar Un Vector 3d
Publicado por: The-Force en 03 de Octubre de 2005, 06:36:11 PM
 si yo tengo un vector v=(x,y,z) y quiero rotarlo que debo hacer?
Buscando he encontrado ke hay ke multiplicar mi vector como si de una matriz se tratara por otra matriz de transformacion.

vector (0,1,0) lo quiero girar 90º en el eje z

( 0 0 0 )_( cos(90)_-sen(90)___0  )_(  nx   0    0  )
( 0 1 0 )*( sen(90)__cos(90)__ 0  )=(   0   ny   0  )  
( 0 0 0 )_(___0_______0_____1  )_(   0    0   nz  )

donde  mi vector rotado pasaria a ser (nx,ny,nz) no?

nx = 0*cos(90)   +    0*sen(90)   +   0*0 = 0
ny = 0*-sen(90)   +   1*cos(90)   +   0*0 =  0
nz = 0*0   +   0*0   +   0*1 =  0

vector rotado (0,0,0)
resultado esperado (1,0,0)

igual esta todo mal de arriba a abajo... a saber. Iluminadme porfavor !!!
Título: Rotar Un Vector 3d
Publicado por: vicho en 03 de Octubre de 2005, 07:12:11 PM
 representa el vector mediante
(x)_( cos(90)_-sen(90)___0 )_( nx )
(y)*( sen(90)__cos(90)__ 0 )=( ny )
(z)_(___0_______0_____1 )_( nz )
Título: Rotar Un Vector 3d
Publicado por: The-Force en 03 de Octubre de 2005, 07:57:31 PM
 ^^ Muchisimas gracias!!
asi si me funciona
Título: Rotar Un Vector 3d
Publicado por: The-Force en 03 de Octubre de 2005, 10:40:39 PM
 Ahora el problema es que segun va girando su modulo va disminuyendo.
Me imagino que estara perdiendo precision o algo asi en alguna operacion.
aki el codigo ke gira el vector (Direccion):

void CNave::GirarIzq(){
  double ang = -Grado;
  double det = (cos(ang)*cos(ang))-(1*-sin(ang)*sin(ang));
  Direccion.x = ((Direccion.x*cos(ang)*1)-(1*-sin(ang)*Direccion.y))/det;
  Direccion.y = ((cos(ang)*Direccion.y*1)-(1*Direccion.x*sin(ang)))/det;
  Direccion.z = ((cos(ang)*cos(ang)*Direccion.z)-(Direccion.z*-sin(ang)*sin(ang)))/det;
}

Direccion.x ,.y , .z son double tambien

como podria corregirlo?
Título: Rotar Un Vector 3d
Publicado por: zupervaca en 04 de Octubre de 2005, 03:24:31 PM
 ¿por que no usas matrices para rotar el vector? asi en vez de rotarlo podrias realizar todo tipo de transformaciones, por ejemplo, para calcular el incremento de desplazamiento de la camara, yo lo hago asi
  // Obtener incremento del vector de la camara
  dib::System::Math::Matrix4x4 foward, pt, prx, pry;
  pt.Translate( xspeed, 0, zspeed );
  pry.RotateY( -ya );
  prx.RotateX( -xa );
  foward = pt * prx * pry;
  vpos.x += foward.GetX();
  vpos.y += foward.GetY() - yspeed;
  vpos.z += foward.GetZ();

no se si es la forma mas correcta de hacerlo, pero si por cualquier razon necesitara escalar el vector podria hacerlo sin problemas
Título: Rotar Un Vector 3d
Publicado por: The-Force en 05 de Octubre de 2005, 05:44:17 PM
 Bueno... ya lo hago con matrices pero sigo teniendo el problema de ke cuanto mas giro el vector mas pequeño se me hace y no se como solucionarlo.
Se me ocurre ke cada vez que lo giro le podria calcular el vector unidad pero esto seria algo chapuza no?

nose... ayudaa