Creando un modelo estático para M&BW
También puedes ver este tutorial aquí.
Para seguir el tutorial necesitas tener nociones de modelado 3D (usaremos Blender), diseño gráfico (usaremos GIMP) y programación del Module System de M&BW.
Antecedentes
Debemos tener en cuenta que todos los objetos que puedes encontrar en M&B se dividen en tres grupos según su forma de comportarse en el entorno. Tendremos diferentes tipos de archivos según los tipos de objetos:
- Modelos estáticos (.obj): yelmos, armas, escudos, alimentos, edificios...
- Modelos de animación por vértices (.md3): modelos de animación por vértices: caras, arcos, ballestas, fundas de espadas... (consiste en una animación por fotogramas de varios modelos estáticos).
- Modelos de animación (.smd): animaciones, armaduras, caballos, botas, guantes... (también se conoce por animación por esqueleto)
*Notas:
-Este tutorial no trata sobre el aprendizaje y manejo de las herramientas usadas, se da por sentado que tienes cierto nivel en su uso.
-En el tutorial nos centraremos en los objetos de tipo estático .obj y .md3. El otro tipo de objetos son los .smd, que llevan asociados esqueletos y animaciones, haré un tutorial de ellos más adelante.
-En general el modelo de cada objeto está contenido en un único archivo (existen excepciones con objetos muy grandes como edificios, pero esto también queda fuera del tutorial).
-De aquí en adelante cuando haga referencia a la palabra 'modelo' quiero decir la malla 3D diseñada en Blender y cuando diga 'objeto' me refiero al item, edificio o cualquier otro ente que puedes ver mientras juegas.
Modelado
Existe gran cantidad de software especializado el modelado 3D, en nuestro caso por ser gratuito, vamos a usar el polifacético Blender. Otra buena opción, con menos capacidades, pero más que suficiente para nuestro propósito es Windg3D.
Texturizado
De igual modo puedes usar cualquier editor de imágenes para trabajar con las texturas, nosotros usaremos GIMP. Necesitaras también alguna herramienta que genere mapas de normales y otra que exporte archivos de imagen en formato .dds, existen plugins para GIMP que hacen todo esto.
Empaquetado
M&B necesita usar un "contenedor" para empaquetar los modelos de los objetos y enlazarlos con el motor de juego, otros modelos, texturas etc..., en este paso también aplicaremos los materiales simulados para conseguir un mayor realismo en los objetos, usaremos OpenBRF.
Programación
Este paso consiste en crear el código de nuestro nuevo objeto para que esté disponible en el mod, necesitaras tener instalado Python 2.7 y descargado el 'Module System' para más detalle ve aquí o aquí, si quieres optar por la simplicidad también puedes usar Morgh's.
Descripción del proyecto
Solución paso a paso
Antes de hacer nada vamos a organizarnos creando una nueva carpeta llamada 'MiItem', estará alojada en el escritorio y contendrá todos los archivos con los que trabajemos.
1º Modelado
En esta étapa nos centraremos en el diseño del "cuerpo físico" de nuestra espada.
1.1º
La primera característica a definir en nuestra espada es su tamaño, estableciendo las dimensiones que va a tener, podría no preocuparnos esto ya que en cualquier momento podríamos hacer retoques con OpenBRF o con Blender, pero lo mejor es trabajar seguros desde el primer momento. Así que vamos a usar un patrón. Como nuesto 'item' es una espada bastarda vamos a buscar una espada semejante en los archivos de M&B que nos sirva de guía. Encontramos 'bastard_sword_a.obj' que se encuentra en 'weapons_e.brf' de 'CommonsRes' la exportaremos mediante OpenBrf como modelo estático.
Como también vamos a hacer la funda tomaremos como patrón 'bastard_sword_a_scabbard.md3' en el mismo .brf, tienes que recordar que un archivo .md3 no es más que varios archivos .obj unidos, cada .obj es un cuadro o fotograma de la animación. Las fundas tienen 3 cuadros (puedes verlos en el campo 'línea temporal'), el nº0 y el nº1 son idénticos y muestran al espada enfundada y el cuadro nº2 muestra solo la funda, exportamos como modelos estáticos los cuadros nº1 y nº2.
Los dos patrones que usaremos |
1.2º
Ahora empezamos a modelar en Blender nuestro nuevo diseño de espada, debe ser similar en dimensiones al patrón, para ello puedes importar a Blender los .obj del patrón o colocar una imagen de base sobre la que trabajar.
Si no sabes usar Blender puedes acudir a la inmensidad de tutoriales que ofrece la web.
Debemos tener en cuenta algunos puntos importantes a la hora de comenzar a modelar:
- Al terminar, el modelo debe estar compuesto de una única malla.
- Todas las caras deben ser triangulares.
- Las normales deben quedar hacia fuera.
- No es necesario aplicar materiales.
- No dejes activo ningún modificador de mallas.
- A menos vértices más rendimiento en el juego.
- Eliminar los vértices repetidos
- El origen de la nueva malla debe tener la misma posición que el de la malla patrón. En el caso de las espadas es el mango.
- A la hora de exportar las mallas, el origen de la misma debe coincidir con el origen absoluto, posición (0,0).
- Hay partes de la malla que deben estar irremediablemente en una posición determinada. Como las correas al cinturón de las fundas de espada, de los escudos, de los carcaj etc... Esto es así para que en el juego cada 'item' quede alineado con el cuerpo del personaje.
Este proceso es delicado y depende de la pericia del modelador obtener unos buenos resultados. Tras un ratito de modelaje:
Los tres modelos de la izquierda son los patrones, los tres de la derecha nuestros modelos |
Recordad: En los detalles está la diferencia.
Hemos llamado a nuestras mallas: 'miespada', miespadafunda1', 'miespadaCCfunda2' pero aún no la exportamos.
En esta etapa aplicaremos color a nuestros modelos mediante la aplicación de texturas.
Podemos trabajar según tres modos diferentes. El primero consiste en diseñar la textura para posteriormente 'desenrollar' la malla encima, el segundo método 'desenrolla' la malla primero y luego aplicar la textura y por último está el término medio, que es un poco de una y un poco de otra. Yo trabajaré según el primer método.
2.1º
Abrimos GIMP y creamos un nuevo archivo que llamaremos 'textura_miespada'.
Debemos tener en cuenta algunos puntos importantes a la hora de comenzar a crear la textura:
-El tamaño de la textura dependerá de la relación rendimiento/detalle que desees en el juego. Es aconsejable que tengan una relación 1:1 en las dimensiones (para el caso de la espada un 1024x1024px es más que aceptable)
-Aprovecha al máximo el área de la imagen/textura. Intentar no encoger el tamaño de las proyecciones originales, es preferible girar objetos, llevar al límite de la imagen las proyecciones, no dejar huecos vacíos...
Nuestra espada no requiere ninguna textura compleja, así que después de poco tiempo:
Textura de color para el modelo |
2.2º
Exportamos la imagen en formato .dds y elegimos el tipo deseado según la relación peso/detalle que aceptamos y del uso del canal alfa, el tipo DXT1 es suficiente para nuestra espada. Debemso activar siempre la opción 'Generate mipmaps' o mapas MIP que consiguen una mayor fluidez en el juego, los mipmaps son imágenes de mapa de bits que acompañan a la textura en diferentes niveles de detalle, esto significa que una vez en el juego, si la espada está muy lejos de la cámara del jugador se utilizaran los mapas de bits de menor resolución y solo cuando nos vamos acercando se muestran las más detalladas, mejorando así el el rendimiento.
2.3º
Este punto debería estar en el apartado Modelado pero es necesario llevar a cabo el paso anterior para poder realizarlo, así que aquí o colocamos.
Ahora llega un trabajo laborioso: hacer unwrap a las mallas o lo que es lo mismo 'desenrrollar' las mallas.
Esto consiste básicamente en proyectar en un plano 2D (la textura) la superficie de la malla 3D (el modelo). Podemos usar muy diversas técnicas atendiendo principalmente a la complejidad de nuestro modelo. La espada es muy sencilla y no necesitaremos siquiera usar zonas de corte. Desenrollamos por las vistas: alzado, planta y perfil.
Así que importamos la imagen 'textura_miespada' a Blender y procedemos.
En nuestro caso solo es necesario desenrollar 2 de las 3 mallas, la espada desenfundada y la funda, la otra malla es solo una combinación de ambas. Los tres modelos deben desenrollarse en la misma textura para que compartan origen de coordenadas.
Así nos quedó:
Modelos de la espada con la textura aplicada |
Exportamos los tres modelos en formato .obj y sin modificaciones con los nombres: 'miespada.obj', 'miespadafunda1.obj', 'miespadafunda2.obj' (recuerda, sus orígenes de coordenadas deben estar en el la posición (0,0)).
2.4º
Elegir y editar las texturas de forma correcta es el método más importante (además de la aplicación de materiales y de los detalles del modelo) para dar realismo al objeto en el juego, por esto hay que poner mucho empeño en ello. Con realismo no me refiero a que nuestros objetos luzcan en le juego como lo harían en la vida real, ya que si diseñamos unos pocos objetos que así fuesen, si el resto de objetos en el juego no lo son la heterogeneidad resultante da un aspecto extraño a nuestro mod. Debemos elegir que mundo queremos representar. Por esta razón, es muy probable que una vez hayamos llegado al final del tutorial, diseñado nuestro objeto y probado dentro del motor de juego, tengamos que volver a repetir algunos pasos para retocar la textura o el modelo y conseguir así que se vea lo más en sintonía posible con su mundo virtual.
Muchos modders no lo hacen así, lo que conlleva tener una calidad gráfica pobre y dificulta a los jugadores la inmersión en el mundo virtual.
Muchos modders no lo hacen así, lo que conlleva tener una calidad gráfica pobre y dificulta a los jugadores la inmersión en el mundo virtual.
2.5º
La textura que hemos diseñado en los pasos anteriores da color al objeto, es necesaria pero no suficiente en la mayoría de los casos para obtener un buen grado de realismo. Vamos a diseñar dos texturas más, así que tendremos tres en total:
- Textura difusa o RGB. Contiene la información del color. Ya la tenemos hecha.
- Textura de mapa de normales. Ofrece información sobre el relieve (con esta técnica podemos añadir pequeños detalles en el modelo sin tener que modelarlos en la malla)
- Textura especular. Contiene información sobre la reflexión de luz en el objeto.
Para el mapa de normales o normalmap podemos hacer uso del plugin de GIMP, tan solo hay que aplicar la función del plugin sobre nuestra primera textura.
Para la textura especular podemos seguir varios procedimientos, pero lo más sencillo es retocar la primera textura. Debemos tener una imagen saturada con colores grises planos, donde el blanco indica reflexión máxima de la luz sobre la superficie del objeto y el negro mínima.
Exportamos como .dds, DXT1 y con mipmaps
Estos son los resultados de las tres texturas:
De izquierda a derecha: textura difusa, mapa de normales y especular |
3º Empaquetado
En este paso 'empaquetaremos' los modelos en el formato .brf, que ayuda al motor de juego de M&B a asociar un modelo con su textura, material, cuerpo de colisión, esqueleto...
3.1º
Resumamos:
Dentro de la carpeta 'MiItem' tenemos los siguientes archivos:
Dentro de la carpeta 'MiItem' tenemos los siguientes archivos:
- Archivos .obj: 'miespada.obj', 'miespadafunda1.obj', 'miespadafunda2.obj'
- Archivos .dds: 'textura_miespada.dds', 'normalmap_miespada.dds', 'especular_miespada.dds'
Ahora creamos un nuevo archivo .brf en la carpeta gracias OpenBRF, e importaremos la malla 'espadaCC.obj' como modelo estático; después creamos el modelo de animación por vértices con dos frames, la espada enfundada y desenfundad, al igual que aparecía en el modelo de la espada bastarda que usamos como patrón al comienzo del tutorial.
Os explicamos como crear esta animación por vértices: importamos 'miespadafunda1.obj' como modelo estático y ahora manteniendolo seleccionado importamos un cuadro o fotograma de animación por vértices y seleccionamos 'miespadafunda1.obj', vemos como ha aparecido la línea temporal, avanzamos un frame y con el objeto seleccionado añadimos un nuevo cuadro que será 'miespadafunda2.obj', listo, ya tenemos la animación por vértices, en caso de necesidad podría ser exportado con formato .md3. En la línea temporal debemos indicar los tiempos 0, 0 y 10 para los cuadros 0, 1 y 2 respectivamente tal cual aparece en el modelo patrón.
Os explicamos como crear esta animación por vértices: importamos 'miespadafunda1.obj' como modelo estático y ahora manteniendolo seleccionado importamos un cuadro o fotograma de animación por vértices y seleccionamos 'miespadafunda1.obj', vemos como ha aparecido la línea temporal, avanzamos un frame y con el objeto seleccionado añadimos un nuevo cuadro que será 'miespadafunda2.obj', listo, ya tenemos la animación por vértices, en caso de necesidad podría ser exportado con formato .md3. En la línea temporal debemos indicar los tiempos 0, 0 y 10 para los cuadros 0, 1 y 2 respectivamente tal cual aparece en el modelo patrón.
3.2º
Debemos ahora cambiar de directorio de trabajo. Vamos a llevarnos los archivos a la carpeta del mod que supuestamente estas desarrollando. Copiamos nuestras 3 texturas dentro de la carpeta 'Textures' de tu mod y nuestro recién creado archivo .brf al que hemos llamado 'mistitems.brf' dentro de 'Resource'.
Abrimos el .brf e importamos un nuevo material vacío con el nombre 'material_miespada' y también importamos 3 referencias a texturas a las que les pondremos los nombres 'textura_miespada.dds', 'normalmap_miespada.dds', 'especular_miespada.dds', justo en el instante de ponerle esos nombre, idénticos a nuestras texturas, estas quedan vinculadas y deben poder verse desde OpenBRF.
Nuestro propósito ahora es configurar correctamente los elementos que aparecen en las pestañas 'Mod' (modelos), 'Mat' (materiales) y 'Text' (texturas).
Texturas dentro del .brf
Podemos apreciar como en cada una de las tres texturas se pude modificar un campo llamado 'Indicad', su funcionalidad es confusa y mi consejo es que a cada textura, en este campo, le coloquéis el mismo valor que tienen las texturas del objeto patrón en su .brf.
Materiales dentro del .brf
Nuestro propósito ahora es configurar correctamente los elementos que aparecen en las pestañas 'Mod' (modelos), 'Mat' (materiales) y 'Text' (texturas).
Texturas dentro del .brf
Podemos apreciar como en cada una de las tres texturas se pude modificar un campo llamado 'Indicad', su funcionalidad es confusa y mi consejo es que a cada textura, en este campo, le coloquéis el mismo valor que tienen las texturas del objeto patrón en su .brf.
Materiales dentro del .brf
La pestaña 'Mat' es de vital importancia para conseguir realismo dentro del juego y si no se modifica adecuadamente pueden ocurrir errores en el momento de cargar el juego, se cuidadoso. Lo mejor, al igual que con las texturas, es tener a mano el .brf del objeto patrón y guiarnos, en este caso, por la configuración de sus materiales.
Los campos disponibles y los valores que hemos dado son:
Los campos disponibles y los valores que hemos dado son:
- Sombreado: envmap_shader_Instanced (básicamente significa que nuestro objeto tiene un sombreado de environment map, abajo lo explico)
- Difuso A: textura_miespada (el nombre de la textura que da color. No poner .dds)
- Difuso A: none (seré sincero, no se para que vale esto, jamás lo use ni lo vi en M&B nativo. Parece ser otra textura de color, pero no se cual es la relación A-B. Lo dejamos en none)
- Desplazamiento: normalmap_miespada (el nombre de la textura que contiene el mapa de normales. No poner .dds)
- Entorno: earthenvmap (aquí debemos poner una textura que simule el entorno en el que se encuentra el objeto, pera que la reflexión de luz sea lo más realista posible. M&B usa por defecto esa textura que simula un paisaje exterior, podríamos poner cualquier otra. Solo debemos usarlo para objetos que reflejen luz, metales pulidos sobre todo)
- Especular: especular_miespada (el nombre de la textura que contiene la información especular o de reflejo de luz No poner .dds)
- Espectro RGB: indica como se comportan los diferentes componentes de color ante la reflexión. Practicante solo para metales.
- Coeficiente: Coeficiente que indica el tamaño de las zonas que reflejan. Practicante solo para metales.
- Insignia: Este valor es un conjunto de bits que contienen información avanzada del material, si no sabes usarlo lo mejor es dejarlo con el mismo valor que el modelo patrón.
- Recuerda que a materiales más complejos más realismo y menos rendimiento.
Modelos dentro de .brf
En la pestaña 'Modelo' indicamos el material asociado a cada modelo. El valor insignia mantelo siempre en 0.
También podemos hacer uso de algunas herramientas muy útiles como el sombreado oclusión ambiental, el re-cálculo de normales y por supuesto lo que debemos hacer siempre es el cálculo de niveles de detalle (level of detail - LOD) para cada malla. Esto crea mallas adicionales con un detalle menor a la original, funciona de modo similar a los mipmaps de las texturas, mejoran el rendimiento si el objeto se encuentra lejos de la cámara.
Descárgate los archivos que adjunto al final de la entrada para ver con detalle como ha quedado configurado el archivo .brf
*Nota:
Si nuestro objeto fuera un edificio, piedra, árbol, valla o cualquier tipo de objeto que los NPC's y caballos deban considerar en el juego como objetos sólidos que no deben traspasarse, es necesario crear objetos de colisión.
Si nuestro objeto fuera un edificio, piedra, árbol, valla o cualquier tipo de objeto que los NPC's y caballos deban considerar en el juego como objetos sólidos que no deben traspasarse, es necesario crear objetos de colisión.
Este es el último paso, añadiremos los códigos al 'Module_System', para que nuestra espada esté disponible en el juego. Como nuestro objeto es un arma nos dirigimos a definirla en 'module_items.py'. De nuevo vamos a usar usaremos un patrón que nos sirva de guía. Buscamos el código de nuestro patrón, la espada bastarda, es éste:
1 2 | [ "bastard_sword_a" , "Bastard Sword" , [( "bastard_sword_a" , 0 ),( "bastard_sword_a_scabbard" , ixmesh_carry)], itp_type_two_handed_wpn|itp_merchandise| itp_primary, itc_bastardsword|itcf_carry_sword_left_hip|itcf_show_holster_when_drawn, 294 , weight( 2.0 )|difficulty( 9 )|spd_rtng( 98 ) | weapon_length( 101 )|swing_damage( 35 , cut) | thrust_damage( 26 , pierce),imodbits_sword_high ], |
Lo copiamos y los añadimos al final del archivo justo antes de la línea:
1 | [ "items_end" , "Items End" , [( "shield_round_a" , 0 )], 0 , 0 , 1 , 0 , 0 ], |
Ahora lo modificamos a nuestro gusto.
Cuidado, no se permiten letras mayúsculas en los identificadores.
Cuidado, no se permiten letras mayúsculas en los identificadores.
Ya que nuestra espada ha sido forjada por el mismísimo Hefesto en su forja para unos héroes como nosotros, le aumentaremos los valores de daño y le ponemos el modificador 'imodbits_none' para que siempre sea una espada perfecta.
Guardamos y compilamos.
Este es nuestro código:
Guardamos y compilamos.
Este es nuestro código:
1 2 | [ "miespada" , "Mi Espada" , [( "miespada" , 0 ),( "miespadafunda" , ixmesh_carry)], itp_type_two_handed_wpn|itp_merchandise| itp_primary, itc_bastardsword|itcf_carry_sword_left_hip|itcf_show_holster_when_drawn, 494 , weight( 3.0 )|difficulty( 9 )|spd_rtng( 96 ) | weapon_length( 101 )|swing_damage( 45 , cut) | thrust_damage( 28 , pierce),imodbits_none], |
No se nos puede olvidar que debemos indicarle al juego que tiene disponible un nuevo archivo .brf que cargar en el arranque. Abrimos 'module.ini' en la carpeta del mod y añadimos la línea load_mod_resource = misitems
El lugar no importa, pero es conveniente ponerlo justo después de la carga de los otros .brf.
El lugar no importa, pero es conveniente ponerlo justo después de la carga de los otros .brf.
Y ya hemos finalizado. Ahora 'MiEspada' estará disponibles en los mercados para su compra, ya depende de ti modificar el código para hacer el uso de ella que más te convenga.
Resultado
Como un soldado no solo merece una espada sino también un escudo, trabajé en uno, no lo modelé tan solo le cambié las texturas. Espero que más de uno de vosotros juegue con ellos.
Aquí una impresión de pantalla del resultado.
Nuestros modelos en el juego |
0 comentarios:
Publicar un comentario