Logo

¡Bienvenido a Stratos!

Acceder

Foros



Menu

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menu

Temas - Findeton

#1
Programación gráfica / Cargar modelos con animaciones
23 de Enero de 2003, 10:29:36 PM
                                Buenas a todos. Estoy ya dando mis primeros pasos en cuanto a la programación con DirectX y me he puesto a pensar en cargar modelos 3D con animaciones. En páginas como gamedev.net o gametutorials.com he podido ojear artículos de cómo cargar modelos del quake 2 y quake 3. De hecho esta tarde cogí el código del primer ejemplo de gametutorials de cómo cargar un archivo del quake 2y lo pasé de opengl a directx, eso sí, teniendo algún que otro problemilla, aunque por ahora no viene al caso.

En definitiva, os pido ayuda para saber los pros y contras de los diferentes formatos. He oído que el formato smd, para los modelos de half life es bueno, ya que va por bones y puedes girar la cabeza independientemente de otras partes del cuerpo, por ejemplo, y que se le pueden añadir todas las texturas que quieras en un sólo modelo. Luego, también oí que el formato de quake 3 tb va por bones, etc... En fin, que estoy hecho un lío y, por primera vez, os pido que ayudéis a un novatillo en busca de cierta sabiduría.                                
#2
Programación gráfica / Leer Vertex Buffers
16 de Noviembre de 2002, 10:31:03 PM
                                Hola de nuevo. Me gustaría saber cómo poder obtener y leer el buffer de vértices una vez ha empezado el programa, querría saber qué falla aquí:

VERTCUBO* CCubo::dar(void){

   VOID* pVertices;

VERTCUBO cvVertices[18];

VERTCUBO* f;

   

// Siempre que queramos añadir vértices a nuestro buffer, debemos bloquear el

// buffer.

if(FAILED(BufferVert->Lock(0, 0, (BYTE**)&pVertices, D3DLOCK_READONLY )))

   {

       return FALSE;

   }



   // copiamos a la zona de memoria a la que apunta nuestro buffer

//de vértices a una variable.

   memcpy(cvVertices , pVertices, sizeof(pVertices));



   // ¡Nunca olvidar desbloquear el buffer cuando se halla terminado de rellenarlo!

   BufferVert->Unlock();

   f= cvVertices;

return f;

}



Para más datos, lo que quiero hacer es poder luego utilizar los datos de 'VERTCUBO* f;'  como muestro abajo, junto con la definición de la estructura VERTCUBO, tened en cuenta que hay 18 vértices en el buffer:



struct VERTCUBO

 {

  public:

  FLOAT x, y, z;  

  DWORD color;

  FLOAT tu, tv;

 };



//Y quiero utilizar f así:



VERTCUBO* f=Cubo2->dar();

  float aaa=f[0].x;
                               
#3
                                Hola,estoy intentando crear una serie de funciones que me sirvan para detectar la colisión entre polígonos, esferas y líneas y me he encontrado un problema:

Estoy intentando encontrar la intersección entre 2 planos, los cuales han sido calculados a partir de 2 polígonos, dándome así la ecuación de cada plano Ax +By + Cz +D = 0, siendo el vector normal de cada plano (x=A, y=B, z=C). Entonces, utilizando el método de Microsoft, que viene descrito en la web http://research.microsoft.com/~jckrumm/Int..._two_planes.htm , sólo necesito resolver un sistema de ecuaciones en forma de matrices.


Para ello, me fui a la web http://www.sc.ehu.es/sbweb/fisica/cursoJav...iz1/matriz1.htm donde explican que para saber la solución de A*S=B (donde A es una matriz conocida, B un vector conocido y S el vector solución), hay que calcular la inversa de A y multiplicarla por B, y te dará S. Entonces, como en esa misma web me viene el código para calcular la inversa... pensé que todo estaba solucionado... pasé el código a C++ y... pues sólo calcula bien la inversa de matrices 2x2, cuando el método descrito en la web es para nxn, donde n es cualquier número entero.

Así que posteo el código para que comprobéis si hay algún error, si podéis  :(.

Ésta es la función que calcula la matriz inversa:




Matriz matriz_inversa(Matriz d){

       int n=d.n;     //dimensión de la matriz

 Matriz a(n);

 a=d;

       Matriz b(n);    //matriz de los términos independientes

       Matriz c(n);    //matriz de las incógnitas



//matriz unidad

       for(int i=0; i<n; i++){

           b.x[i][i]=1.0;

       }

//transformación de la matriz y de los términos independientes

       for(int k=0; k<n-1; k++){

           for(int i=k+1; i<n; i++){

//términos independientes

               for(int s=0; s<n; s++){

                   b.x[i][s]-=a.x[i][k]*b.x[k][s]/a.x[k][k];

               }

//elementos de la matriz

               for(int j=k+1; j<n; j++){

                   a.x[i][j]-=a.x[i][k]*a.x[k][j]/a.x[k][k];

               }

           }

       }

//cálculo de las incógnitas, elementos de la matriz inversa

       for(int s=0; s<n; s++){

           c.x[n-1][s]=b.x[n-1][s]/a.x[n-1][n-1];

           for(int i=n-2; i>=0; i--){

               c.x[i][s]=b.x[i][s]/a.x[i][i];

               for(int k=n-1; k>i; k--){

                   c.x[i][s]-=a.x[i][k]*c.x[k][s]/a.x[i][i];

               }

           }

       }

       return c;

   }



Y aquí está la definicíon de la clase Matriz:



class Matriz {



public:

int n;         //dimensión

   double** x;     //el valor

   Matriz(int m); //constructor

  ~Matriz();     //destructor

  void mostrar();

   };





//Aquí definimos el constructor



Matriz::Matriz(int m) {

       n=m;

       x= new double*[n];

       for(int i=0; i<n; i++){

  x[i]= new double[n];

 }  

       for(i=0; i<n; i++){

           for(int j=0; j<n; j++){

               x[i][j]=0.0;

           }

       }

   }



//Aquí definimos el destructor



Matriz::~Matriz() {

   

                     

   }



void Matriz::identidad(){

       for(int i=0; i<n; i++){

           for(int j=0; j<n; j++){

               x[i][j]=0.0;

           }

       }

 for(i=0; i<n; i++)

  x[i][i]=1;

}

void Matriz::identidad(double m){

       for(int i=0; i<n; i++){

           for(int j=0; j<n; j++){

               x[i][j]=0.0;

           }

       }

 for(i=0; i<n; i++)

  x[i][i]=m;

}



void Matriz::mostrar(){



for(int i=0; i<n;i++){ //hay que poner '< n' y no '<= n' pq si no, se pasará, ya que las matrices empiezan en 0

 for(int k=0; k<n;k++){//hay que poner '< n' y no '<= n' pq si no, se pasará, ya que las matrices empiezan en 0

        cout << x[i][k] << " ";

 }

 cout << endl;

}

}






Si necesitáis más datos, por favor pedirlos, pero ya os digo que un código de ejemplo sería:



#include "iostream.h"



/*Poned aquí la definición de la matriz y sus funciones*/



int main(int argc, char* argv[])

{

Matriz b(3);



b.x[0][0]=4;

b.x[0][1]=1;

b.x[0][2]=1;

b.x[1][0]=2;

b.x[1][1]=3;

b.x[1][2]=1;

b.x[2][0]=2;

b.x[2][1]=3;

b.x[2][2]=1;



   

b=matriz_inversa(b);

b.mostrar();



return 0;

}
                               
#4
                                Hola,estoy intentando crear una serie de funciones que me sirvan para detectar la colisión entre polígonos, esferas y líneas y me he encontrado un problema:

Estoy intentando encontrar la intersección entre 2 planos, los cuales han sido calculados a partir de 2 polígonos, dándome así la ecuación de cada plano Ax +By + Cz +D = 0, siendo el vector normal de cada plano (x=A, y=B, z=C). Entonces, utilizando el método de Microsoft, que viene descrito en la web http://research.microsoft.com/~jckrumm/Int..._two_planes.htm , sólo necesito resolver un sistema de ecuaciones en forma de matrices.


Para ello, me fui a la web http://www.sc.ehu.es/sbweb/fisica/cursoJav...iz1/matriz1.htm donde explican que para saber la solución de A*S=B (donde A es una matriz conocida, B un vector conocido y S el vector solución), hay que calcular la inversa de A y multiplicarla por B, y te dará S. Entonces, como en esa misma web me viene el código para calcular la inversa... pensé que todo estaba solucionado... pasé el código a C++ y... pues sólo calcula bien la inversa de matrices 2x2, cuando el método descrito en la web es para nxn, donde n es cualquier número entero.

Así que posteo el código para que comprobéis si hay algún error, si podéis  :(.

Ésta es la función que calcula la matriz inversa:




Matriz matriz_inversa(Matriz d){

       int n=d.n;     //dimensión de la matriz

 Matriz a(n);

 a=d;

       Matriz b(n);    //matriz de los términos independientes

       Matriz c(n);    //matriz de las incógnitas



//matriz unidad

       for(int i=0; i<n; i++){

           b.x[i][i]=1.0;

       }

//transformación de la matriz y de los términos independientes

       for(int k=0; k<n-1; k++){

           for(int i=k+1; i<n; i++){

//términos independientes

               for(int s=0; s<n; s++){

                   b.x[i][s]-=a.x[i][k]*b.x[k][s]/a.x[k][k];

               }

//elementos de la matriz

               for(int j=k+1; j<n; j++){

                   a.x[i][j]-=a.x[i][k]*a.x[k][j]/a.x[k][k];

               }

           }

       }

//cálculo de las incógnitas, elementos de la matriz inversa

       for(int s=0; s<n; s++){

           c.x[n-1][s]=b.x[n-1][s]/a.x[n-1][n-1];

           for(int i=n-2; i>=0; i--){

               c.x[i][s]=b.x[i][s]/a.x[i][i];

               for(int k=n-1; k>i; k--){

                   c.x[i][s]-=a.x[i][k]*c.x[k][s]/a.x[i][i];

               }

           }

       }

       return c;

   }



Y aquí está la definicíon de la clase Matriz:



class Matriz {



public:

int n;         //dimensión

   double** x;     //el valor

   Matriz(int m); //constructor

  ~Matriz();     //destructor

  void mostrar();

   };





//Aquí definimos el constructor



Matriz::Matriz(int m) {

       n=m;

       x= new double*[n];

       for(int i=0; i<n; i++){

  x[i]= new double[n];

 }  

       for(i=0; i<n; i++){

           for(int j=0; j<n; j++){

               x[i][j]=0.0;

           }

       }

   }



//Aquí definimos el destructor



Matriz::~Matriz() {

   

                     

   }



void Matriz::identidad(){

       for(int i=0; i<n; i++){

           for(int j=0; j<n; j++){

               x[i][j]=0.0;

           }

       }

 for(i=0; i<n; i++)

  x[i][i]=1;

}

void Matriz::identidad(double m){

       for(int i=0; i<n; i++){

           for(int j=0; j<n; j++){

               x[i][j]=0.0;

           }

       }

 for(i=0; i<n; i++)

  x[i][i]=m;

}



void Matriz::mostrar(){



for(int i=0; i<n;i++){ //hay que poner '< n' y no '<= n' pq si no, se pasará, ya que las matrices empiezan en 0

 for(int k=0; k<n;k++){//hay que poner '< n' y no '<= n' pq si no, se pasará, ya que las matrices empiezan en 0

        cout << x[i][k] << " ";

 }

 cout << endl;

}

}






Si necesitáis más datos, por favor pedirlos, pero ya os digo que un código de ejemplo sería:



#include "iostream.h"



/*Poned aquí la definición de la matriz y sus funciones*/



int main(int argc, char* argv[])

{

Matriz b(3);



b.x[0][0]=4;

b.x[0][1]=1;

b.x[0][2]=1;

b.x[1][0]=2;

b.x[1][1]=3;

b.x[1][2]=1;

b.x[2][0]=2;

b.x[2][1]=3;

b.x[2][2]=1;



   

b=matriz_inversa(b);

b.mostrar();



return 0;

}
                               





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