GMDTech

  • Español (spanish formal Internacional)
  • Português (Brasil)
  • English (United Kingdom)

Under Construction

A+ R A-

DirectX Tigre Mesh

Print

 

DirectX with a tiger model more its corresponding texture. I think I took 3 months to learn the technology and adapt the DirectX SDK to C + + CodeGear. I did a mini tutorial on this program your can see below by clicking on "read more ...".This tutorial had done it in 2008 to clubdelphi as a gesture of appreciation for what i learned on that page.

 

Screen Shot:

DX tigre

Mini TUTORIAL

Para empezar vamos a a realizar los siguientes pasos:
1) Instalar JDK DirectX, el mio es "Microsoft DirectX SDK (March 2008)"
Por ejemplo yo lo instale en "C:\Program Files\CodeGear\Microsoft DirectX SDK (March 2008)" al lado del "RAD Studio"


2) Una vez instalado vamos a tener que tomar los .lib que tienen en la carpeta "C:\Program Files\CodeGear\Microsoft DirectX SDK (March 2008)\Lib\x86" (claro, si la arquitectura de la pc que utilizan es x86) y llevar a todos los .lib a una carpeta en la unidad c, en mi caso los deje en una carpeta "c:\translib", y ahora nos vamos a "C:\Program Files\CodeGear\RAD Studio\5.0\bin" y buscamos el ejecutable "coff2omf.exe" y lo llevamos en la carpeta donde dejamos los .lib (translib), coff to omf hace lo que el mismo nombre lo dice, y el comando para transformar a omf un .lib de Visual Studio es "coff2omf d3d9.lib d3d9.~lib" (alt+126) para el caso de d3d9.lib, luego llevamos el d3d9.~lib a la carpeta de nuestro proyecto, la renombramos a d3d9.lib. Solo nos queda Agregar el lib a nuestro proyecto, para eso vamos a usar (EN LA IDE CODEGEAR) el Proyect Manager (View->Structure, en la barra) y sobre el proyecto botonDerecho->Add, y elegimos el archivo .lib que vamos a ocupar, tal como muestra en la figura1, los .lib dependen de que archivos de cabecera se incluyen


Figura 1:


DX Tigre



3) Ya tenemos nuestro .lib, ahora nos falta agregar los archivos de cabecera, para eso vamos a tener que copiar todos los .h de la carpeta "C:\Program Files\CodeGear\Microsoft DirectX SDK (March 2008)\Include" y dejarlos en "C:\Program Files\CodeGear\RAD Studio\5.0\include". O simplemente agregar al path del proyecto la primer direccion y asi nos ahorramos copiar


4) Con todo lo anterior ya podemos meter en nuestro proyecto por ejemplo el "#include "d3dx9.h"", pero tenemos un problema mas, las funciones que utiliza el visual studio como el coseno y la raiz cuadrada que retornan flotante tienen otro nombre, asique unas lineas antes de meter el "#include "d3dx9.h"" vamos a tener que poner "#define cosf cos" y "#define sqrtf sqrt", este paso es casi solo demostrativo, ya que van a tener que definir funciones segun vayan apareciendo los problemas (obviamente funciones con la misma abstraccion pero con distinto identificador), pero con lo anterior ya es suficiente para el ejemplo que voy a poner


--- empezamos a utilizar la SDK de DirectX ----

5) Luego los pasos para seleccionar un dispositivo (ver antes tipos de dispositivos), inicializar directx, elegir resolucion, color, etc. están bien explicadas en la SDK de Directx, les recomiendo que lean bien y practiquen todo desde el principio. (DirectX Documentation for C++)


6) hecho lo anterior, si seguimos con el orden de la SDK vamos a llegar a la parte de mallas (un objeto grafico 3D), tambien la SDK explica que es una malla, como leerla en memoria, que puntero hace referencia a su buffer, como se toma la textura, etc.

7) Lo interesante de todo esto, cuando usamos el "DirectX Sample Browser", los ejemplos estan en visual c++, por lo tanto nos jode un poco. Vamos a tener que adaptar el codigo de ejemplo a nuestro compilador. Aca entra en juego el conocimiento del lenguaje y de la ide de cada compilador, por ejemplo:

//-----------------------------------------------------------------------------
// Global variables
//-----------------------------------------------------------------------------
LPDIRECT3D9             g_pD3D           = NULL; // Used to create the D3DDevice
LPDIRECT3DDEVICE9       g_pd3dDevice     = NULL; // Our rendering device
LPD3DXMESH              g_pMesh          = NULL; // Our mesh object in sysmem
D3DMATERIAL9*           g_pMeshMaterials = NULL; // Materials for our mesh
LPDIRECT3DTEXTURE9*     g_pMeshTextures  = NULL; // Textures for our mesh
DWORD                   g_dwNumMaterials = 0L;   // Number of mesh materials

¿donde van mis variables globales que se pueden inicializar cuando las defino en c++ RAD Studio?, pues en el archivo unit1.cpp debajo de "TForm1 *Form1;" , despues lo que queda es copiar y pegar. (siempre y cuando se entienda lo que uno esta copiando)

las definiciones en las funciones en visual studio c++


HRESULT InitD3D( HWND hWnd )
{
// Create the D3D object.
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;
...
...

en nuestro proyecto una funcion no debe estar definida en cualquier lado como lo hace VS c++, para adaptar esta parte agregamos a la clase TForm1, en la parte publica, un metodo "HRESULT InitD3D( HWND hWnd );" y luego al codigo anterior modificamos solo la parte del nombre quedando

HRESULT TForm1::InitD3D( HWND hWnd )    // :: implementamos la funcion
{
// Create the D3D object.
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;
...
...


el resto se puede dejar como esta si no nos da error.

Errores comunes

*visual studio mete una L antes de un string, solucion, sacar esa L
ejemplo:

 

...
MessageBox(NULL, L"Could not find tiger.x", L"Meshes.exe", MB_OK);
...

pasa a ser

...
MessageBox(NULL, "Could not find tiger.x", "Meshes.exe", MB_OK);
...

*llamada a funciones, si hicimos los pasos anteriores vamos a tener que llamar a nuestras funciones de la forma "Form1->Funcion()"
ejemplo:

...
}
else
Render();
}
...

y queda

...
}
else
Form1->Render();
}
...

*Utilizacion de funciones desconocidas. Mas que un error, es falta de conocimiento, por ejemplo nos va a dar un error porque no estan definidas las funciones
StringCchCopyA(,,)
StringCchCatA(,,)
solo nos queda ir a la ayuda de codegear y ver si tenemos un archivo de cabecera que las contenga, para este caso se debe incluir "#include "strsafe.h"", lo mismo nos va a pasar con "timegettime()" que pide "#include "Mmsystem.h""

 

Download here

Add comment


Security code Refresh