martes, 23 de julio de 2013

8 .-. Modelos 3D. Mallas. Cargando Mallas en el juego.

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.
Antes de nada decir que, DX Managed no dispone de un sistema de objetos para manejar las mallas y que tenemos nosotros que buscar la forma de implementar uno. Para poder hacer eso tenemos que comprender cómo es una malla, que no es más que una serie de coordenadas de puntos que forman triángulos sobre los que se aplica una textura y una serie de materiales que reflejan la luz.

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


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

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