Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Todavia aprendiendo...

Iniciado por Sergio, 01 de Enero de 1970, 01:00:00 AM

« anterior - próximo »

Sergio

                                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!!!!                                
here are only 10 types of people: those who understand binary and those who don't

Lord Trancos

                                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:
                               
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

Sergio

                                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)??                                
here are only 10 types of people: those who understand binary and those who don't

NeLo

                                La matriz afectará a todos los vértices que se dibujen después de aplicarla.
                               
Drowning deep in my sea of loathing

KAKSTAR

                                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 ]                                
akstar

Existen 10 tipos de personas, las que entienden binario y las que no.

DraKKaR

                                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:                                

Lord Trancos

                                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.
                               
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

Sergio

                                Gracias a todos. Entendido perfectamente (aunque no aseguro que vaya a haber mas preguntas al respecto :ojo:).
Pues eso, muchas gracias y un saludo!!                                
here are only 10 types of people: those who understand binary and those who don't

KAKSTAR

                                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.
                               
akstar

Existen 10 tipos de personas, las que entienden binario y las que no.

DraKKaR

                                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                                






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.