Ahora es el turno de las matrices para la rotación de objetos (mallas o modelos, como querais llamarlos). Según tengo entendido hay tres tipos de matrices: de Mundo, de Proyeccion y de Vista (de camara, vamos). Entonces si yo quiero girar un objeto en concreto, como lo hago?? Supuestamente la de mundo gira todo (sino que no se hubiera llamado de mundo xDDD). Y las otras no tienen "nada" que ver...
Saludos y gracias de antemano!!!!
Tienes que girar la de mundo xDDDD
La de proyeccion imagino que sabras para que sirve.
La de vista, viene a ser la camara.
Y la de mundo sirve para los objetos.
Asi si quieres dibujar un escenario y algo moviendose por dicho escenario, deberas de poner una matriz de mundo para el escenario (que indicara la posicion, rotacion, etc del escenario), y renderizar el escenario. DESPUES, estableces una matraiz de mundo para ese "algo" que se mueve y renderizas ese algo.
Ta claro, no? :riendo:
La cosa esta en que cuando tu creas una matriz, no especificas que es exactamente lo que quieres mover, rotar o escalar, y ahi es donde tengo la duda. Por ejemplo:
// creamos un matriz de rotacion para nuestro triangulo, enviando el ángulo
D3DXMatrixRotationX(&rot_matrix,angulo_triangulo);
// Trasladamos un poco a la izquierda al triangulo...
D3DXMatrixTranslation(&trans_matrix,-1.0,0.0f,0.0f);
// Ahora combinamos las 2 para tener nuestro mundo transformado...
D3DXMatrixMultiply(&matWorld,&rot_matrix,&trans_matrix);
// Ahora solo aplicamos la transformación...
obj_dispositivo_D3D->SetTransform(D3DTS_WORLD,&matWorld );
// Nosotros damos a la primitiva una lista de triangulos, desde donde debe
// empezar a leer (0, el principio) y cuantos triangulos estamos dibujando (1).
obj_dispositivo_D3D->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
// creamos un matriz de rotacion para nuestro cuadrado, enviando el ángulo
D3DXMatrixRotationY(&rot_matrix,angulo_cuadrado);
// Trasladamos un poco a la derecha al cuadrado...
D3DXMatrixTranslation(&trans_matrix,1.0,0.0f,0.0f);
// Ahora combinamos las 2 para tener nuestro mundo transformado...
D3DXMatrixMultiply(&matWorld,&rot_matrix,&trans_matrix);
// Ahora solo aplicamos la transformación...
obj_dispositivo_D3D->SetTransform( D3DTS_WORLD, &matWorld );
// dibujamos nuestro cuadrado
obj_dispositivo_D3D->DrawPrimitive(D3DPT_TRIANGLESTRIP,3,2);
con la misma matriz de mundo gira el triangulo y el cuadrado. entonces como sabe d3d que es lo que tiene que girar (ahi esta exactamente mi duda)??
La matriz afectará a todos los vértices que se dibujen después de aplicarla.
Buenas, no soy ningun esperto en DirectX, però si no he entendido mal, tu quieres saber como rotar un objecto.
Si no me equivoco cada objecto tiene una matriz que identifica su orientación, etc. luego tenemos la matriz del mundo como deciais, que si se rota por ejemplo, se rota todos los objectos. Por tanto si modificamos la del objecto ja està.
Se me olvidaba...
Respecto a esto:
Supuestamente la de mundo gira todo
(sino que no se hubiera llamado de mundo
xDDD). Y las otras no tienen "nada" que
ver...
todas estan relacionadas ya que expresan el mundo desde diferentes sistemas de referencia. En el caso de la de mundo, no se si se toma como origen de coordenadas el origen (0,0,0), respecto a la de vista el centro del sistema de referencia seria la posición de la camara, i respecto a la de proyección no me acuerdo... mañana te respondo...
talueg.
[ Este Mensaje fue editado por: KAKSTAR el 2002-08-22 09:05 ]
Kastra creo ke estas ekivocado, no existe ninguna matriz de un objeto y a parte una matriz de mundo por separado. Cualkier transformacion ke vayas a hacerle a un objeto se debe especificar en la matriz de transformacion del mundo.
Lo ke yo hago es, antes de dibujar cada objeto, especificar la matriz de mundo para cada uno segun su posicion en el mundo, rotacion y escala mas o menos como muestro en el siguiente pseudocodigo:
D3DXMATRIX matrizMundo;
- Transladarlo
MT <- Cargar matriz de translacion
matrizMundo=MT*matrizMundo;
- Rotarlo
MR <- Cargar matriz de rotacion
matrizMundo=MR*matrizMundo;
- Escalarlo
MS <- Cargfar matriz escalado
matrizMundo=MS*matrizMundo;
- Aplicar transformacion
SetMatrix(WORLD,matrizMundo)
- Dibujar el objeto
DrawPrimitive...
Ten en cuenta ke las transformaciones se aplicaran en orden inverso a como las hayas escrito, en mi caso se aplicaran en este orden:
1º - Escalado
2º - Rotacion
3º - Traslacion
Espero ke esto te sirva de algo :lengua:
Sergio, cuando llamas a DrawPrimitive se usan las matrices WORLD, VIEW y PROJECTION que hayas establecido antes de la llamada a DrawPrimitive.
Al llamar a SetTransform estableces los valores de dichas matrices. Asi si estableces unos valores para la matriz WORLD antes de dibujar el triangulo y otros valores para dicha matriz antes de dibujar el cuadrado; estas usando la misma matriz pero CON DIFERENTES VALORES.
Gracias a todos. Entendido perfectamente (aunque no aseguro que vaya a haber mas preguntas al respecto :ojo:).
Pues eso, muchas gracias y un saludo!!
Buenas, disculpas por mi respuesta erronia, antes de contestar me miraré con atención los apuntes... :ojo:. Entonces respecto a lo que dice drakkar...
tenemos una matriz de mundo que sera el sistema de referencia en el cual tendremos que hacer las transformaciones, rotaciones, escalados, etc, respecto a cada objecto ?
talueg.
Si, básicamente es eso. En Direct3D existen 2 matrices para las transformaciones espaciales: la view matrix y la world matrix.
La view matrix sirve para colocar la cámara en el mundo (i.e. con D3DXMatrixLookAtLH) . Y la world matrix ke es la matriz ke se utiliza para posicionar, rotar y escalar lo ke vayas a renderizar respecto al mundo. Todo lo ke renderices despues de especificar estas matrices (SetTransform) se verá transformado por ellas.
Si kieres posicionar cada objeto en el mundo en una posicion debes especificar con SetTransform la world matrix ke posicione el objeto en el mundo antes de renderizarlo.
P.D.: mm.. creo ke me repito XD