Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Rotar Un Vector 3d

Iniciado por The-Force, 03 de Octubre de 2005, 06:36:11 PM

« anterior - próximo »

The-Force

 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 !!!

vicho

 representa el vector mediante
(x)_( cos(90)_-sen(90)___0 )_( nx )
(y)*( sen(90)__cos(90)__ 0 )=( ny )
(z)_(___0_______0_____1 )_( nz )

The-Force

 ^^ Muchisimas gracias!!
asi si me funciona

The-Force

 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?

zupervaca

 ¿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

The-Force

 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






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.