Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Situacion de los objetos en directX

Iniciado por Sagan, 25 de Enero de 2007, 07:27:54 PM

« anterior - próximo »

Sagan

HOla, me gustaria saber como puedo situar un objeto en la escena en directX.

Lo que hago ahora mismo es en el metodo que renderiza el objeto:
_device.Transform.World = _worldMatrix; // voy variando esto

Con esto solo muevo su localización a partir de la localizacion que tenia la malla, pero los vertices de la malla no varian sus posiciones. Teneis algun ejemplo de codigo donde pueda ver como se hace esto. Creo que hay que usar una matriz para multiplicar cada punto por esa matriz, ¿esta eso hecho en directx? gracias de antemano.

AK47

No es que este hecho, es que es la forma que tiene de trabajar Direct3D en ese modo. Antes de intentar hacer algo con Direct3D mirate que es el espacio del modelo, del mundo, de la vista y de la proyeccion.

Sagan

Antetodo gracias por contestar, tengo mas o menos claro que es cada una de esas cosas. De un tutorial he extaido esto y lo entiendo:

"La matriz world generalmente se actualiza cada vez que movemos, o rotamos el objeto al que le pertenece (cada objeto tiene una individual), la matriz view se cambia cada vez que movamos la cámara y la matriz de proyección generalmente solo se configura una vez al inicio del juego"

Yo lo tengo asi en mi motor, pero lo que no se hacer es situar mi objeto en el centro, es decir, que cada objeto que creo con el 3d studio max pues tiene sus coordenadas propias y por tanto no me salen en el centro. Hay que cambiarlo desde el 3d studio max o se puede hacer en directX ? Es que los valores de los vertices no se me modifican si modifico la matriz del mundo de cada objeto. ¿sabes como se haría? cualquier orientación me sería de ayuda, gracias.

AK47

En el 3D Max (o editor 3D que tengas) debes centrar tus objetos en (0, 0, 0). Por decirlo de alguna forma, cuando aplicas una matriz de mundo al objeto (con el SetTransform) se agarra el punto (0, 0, 0) y se mueve, rota o escala el objeto respecto a ese punto. Y si, cuando aplicas la matriz de transformacion, no se modifican las coordenadas del objeto que esta en la  memoria de la tarjeta. Direct3D coge esos vertices y los transforma con una serie de matrices (transformacion, vista, proyeccion, etc) y lo dibuja en pantalla. Asi solo tienes que crear matrices respecto al objeto original y no respecto a su ultima posicion (que es lo que pasaria si los vertices cambiasen con cada SetTransform).

Vaya cagarruta de explicacion... A ver si lo entiendes XD

marcode

Cita de: "Sagan"
Yo lo tengo asi en mi motor, pero lo que no se hacer es situar mi objeto en el centro, es decir, que cada objeto que creo con el 3d studio max pues tiene sus coordenadas propias y por tanto no me salen en el centro. Hay que cambiarlo desde el 3d studio max o se puede hacer en directX ? Es que los valores de los vertices no se me modifican si modifico la matriz del mundo de cada objeto. ¿sabes como se haría? cualquier orientación me sería de ayuda, gracias.

Puedes cambiar la posición de los vértices al inicio al cargar el modelo, pero luego sería una locura modificarlos todos cada vez.

Si quieres centrar el objeto o modificar su posición relativa puedes crearle una matriz aparte (llámala local o model), y luego multiplicarla a la del mundo. Es decir, en lugar de desplazar los vértices uno a uno creas una matriz de desplazamiento, al multiplicar la matriz del mundo por la del modelo cada vértice se dibujará en su posición desplazada.

Esta solución es útil por ejemplo cuando no podemos modificar el origen desde el modelador, cuando queremos tener diferentes orígenes de coordenadas para cada objeto usando un mismo modelo, o cuando queremos hacer rotaciones sobre si mismo usando como centro el que elijamos. No sé si te servirá.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]






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.