Bien, vamos con uno de los temas más atractivos de los juegos: las mallas o meshes como se les dice en inglés. Como habéis podido ver, crear un personaje complejo con triángulos mediante el empleo de vértices sería muy complejo, para eso, existen muchos programas de diseño 3D con los que crear todo lo que se os ocurra. Hoy vamos a emplear Blender, que es gratis y hace de todo. También podeis emplear las mallas que sean free en muchas webs las hay como en esta, Turbosquid.
Malla = Triángulos + Textura + Material.
También tenemos que aclarar que existen una gran cantidad de formatos de mallas. Antes teníamos el formato X propio de DirectX que, posteriormente ha sido sustituido por otros como FBX o Collada. Para nuestro ejemplo usaremos el formato X, algo viejuno pero muy fácil de manejar y entender.
Menos rollo y al grano. Lo primero que vamos a hacer es crear un método que permita cargar una malla desde un fichero X en un objeto tipo MESH. Depués renderizaremos el objeto tantas veces como queramos.
Mallas X Files ;)----> Carga (Loading) ------> ObjetoMesh -------> Renderizado, Renderizado...
En la clase Motor.
Public Sub CargaMalla(ByRef DP3 As Direct3D.Device, ByRef nombremodelo As String, ByRef nombredelmesh As Mesh, ByRef contadormesh As Integer, ByRef material() As Material, ByRef texturas() As Texture)
Try
Dim sModel As String
Dim mtrlBuffer() As ExtendedMaterial
Dim X As Int32
Dim sTemp As String
Dim sAppPath As String
sAppPath = Application.StartupPath & "\3d\Mallas\"
sModel = Application.StartupPath & "\3d\Mallas\" & nombremodelo
If Dir$(sModel) <> "" Then
nombredelmesh = Mesh.FromFile(sModel, MeshFlags.Managed, DP3, mtrlBuffer)
contadormesh = mtrlBuffer.Length
ReDim material(contadormesh - 1)
ReDim texturas(contadormesh - 1)
For X = 0 To mtrlBuffer.Length - 1
material(X) = mtrlBuffer(X).Material3D
material(X).Ambient = material(X).Ambient
material(X).Diffuse = material(X).Diffuse
material(X).Emissive = material(X).Emissive
material(X).Specular = material(X).Specular
If mtrlBuffer(X).TextureFilename <> "" Then
sTemp = sAppPath & mtrlBuffer(X).TextureFilename
texturas(X) = TextureLoader.FromFile(DP3, sTemp)
End If
Next X
Else
End If
Catch ex As Direct3DXException
MessageBox.Show(ex.Message)
End Try
End Sub
Try
Dim sModel As String
Dim mtrlBuffer() As ExtendedMaterial
Dim X As Int32
Dim sTemp As String
Dim sAppPath As String
sAppPath = Application.StartupPath & "\3d\Mallas\"
sModel = Application.StartupPath & "\3d\Mallas\" & nombremodelo
If Dir$(sModel) <> "" Then
nombredelmesh = Mesh.FromFile(sModel, MeshFlags.Managed, DP3, mtrlBuffer)
contadormesh = mtrlBuffer.Length
ReDim material(contadormesh - 1)
ReDim texturas(contadormesh - 1)
For X = 0 To mtrlBuffer.Length - 1
material(X) = mtrlBuffer(X).Material3D
material(X).Ambient = material(X).Ambient
material(X).Diffuse = material(X).Diffuse
material(X).Emissive = material(X).Emissive
material(X).Specular = material(X).Specular
If mtrlBuffer(X).TextureFilename <> "" Then
sTemp = sAppPath & mtrlBuffer(X).TextureFilename
texturas(X) = TextureLoader.FromFile(DP3, sTemp)
End If
Next X
Else
End If
Catch ex As Direct3DXException
MessageBox.Show(ex.Message)
End Try
End Sub
Veamos, a este Sub le pasamos una serie de cosas como la ruta del fichero X, el nombre del objeto Mesh que tenemos declado (aún no lo tenemos) en el juego, y una serie de arrays para los materiales y las texturas, así como una variable que cuenta el número de materiales.
Lo que hace es buscar el modelo indicado en la ruta especificada para las mallas, en mi caso "3D/Mallas/ dentro del directorio de la aplicación y cargarlo en el objeto Mesh que le indiquemos. Recorre todos los materiales y las texturas guardando todo en los arrays que le hemos pasado.
Bien, para poder emplear este Sub, tenemos que declarar en Motor las siguientes cosas arriba de todo:
'Coche
Private CocheMesh As Mesh
Private CocheContadorMateriales As Int32 = -1
Private CocheMaterials() As Material
Private CocheTextures() As Texture
Private CocheMesh As Mesh
Private CocheContadorMateriales As Int32 = -1
Private CocheMaterials() As Material
Private CocheTextures() As Texture
CocheMesh es un objeto de tipo Mesh (malla) que contendrá el coche en sí. CocheContadorMateriales es una variable de tipo número que indicará cuantos materiales contiene la malla, CocheMaterials y CocheTextures son dos arraus que contienen los materiales y las texturas correspondientes al coche. Como podeis comprobar si editais el X file con el NotePad, todos los vértices, texturas y demás vienen declarados en el propio X. Nosotros no hacemos nada más que leer.
Ahora vamos a PosConfigurarDX y escribimos:
Me.CargaMalla(DP3, "Lamborghini.x", CocheMesh, CocheContadorMateriales, CocheMaterials, CocheTextures)
Donde Lamborghini.x es el nombre del fichero X que queremos cargar. Y ya está la malla se cargará. En el siguiente post indicaremos como renderizar la malla.
No hay comentarios:
Publicar un comentario