Modelos 3D

Iniciado por Namerutan, Octubre 27, 2016, 05:16:07 AM

Namerutan

Por sugerencia de Lepastur (en el cuadro de charla del foro), abro un hilo nuevo.

Es muy pronto para desvelar más, pero estoy trabajando en la creación de una herramienta de ayuda a las modificaciones para el juego Heroes4.

Cuando se modifican recursos gráficos, lo ideal es partir de un modelo 3D, del que se obtienen las diversas vistas (renders). Por ejemplo, un modelo de criatura usa vistas en las 8 posibles direcciones y para cada una de las acciones como atacar, defender, caminar, esperar... cada una de esas vistas está compuesta de varios fotogramas, para formar una animación.

No estoy muy puesto en modelado en 3D, así que quería un poco de orientación; no para aprender a modelar, sino sobre cómo podría yo ayudar con mi programa a un artista que modele, de forma que con mi programa pueda modificar (o incluso crear) recursos gráficos del juego.

He echado un vistazo a un modelo 3D que han compartido para su libre uso (adjudicando la autoría), un Wyvern:
Wyvern en OpenArt
Parece que el modelo está hecho en Blender (un programa de modelado), pero lo que me interesa es que el autor ha incluido un "script" para obtener automaticamente las vistas que necesitaba.
Lo que yo quiero es saber si puedo ayudar a crear esos scripts, o incluso usarlos desde mi programa, de modo que el artista no tenga que preocuparse de esos detalles, sólo crear el modelo 3D.

Tito_Reni

Heroes 4 necesita amor :cheers: (y cirugía estética)

Yo ni idea de modelado 3D, pero te deseo suerte y te agradezco el esfuerzo.

Saludos.
MI NECROCRUZADA TECNOMÁGICA TRANSFORMARÁ ESTA TORRE DE MARFIL EN UN POZO DE OBSIDIANA. ¡¡ALZAROS, NECROCRUZADOS!!

Lepastur

Puedes definir qué hace exactamente el script? No sé si lo que hace es sacar las tomas de cada serie de frames en sí, o si sencillamente coge una lista de renders hechos y acopla los sprites en el juego, o qué  :cool:
http://www.rae.es / :worthy: para Krator ¡por ser un campeón! / www.TorredeMarfil.es / Presidente de la plataforma de los Archimagos y Liches flanqueadores de títulos de web.

Namerutan

[quote user="Lepastur" post="80873"]Puedes definir qué hace exactamente el script? No sé si lo que hace es sacar las tomas de cada serie de frames en sí, o si sencillamente coge una lista de renders hechos y acopla los sprites en el juego, o qué  :cool:[/quote]

La verdad es que no tengo mucha idea de lo que hace exactamente, pero sí una idea aproximada.
Creo que indica a Blender que seleccione una animación definida para ese modelo (por ejemplo atacar), sitúe el modelo en cierta posición (por ejemplo mirando al noroeste) y tome unas vistas (los fotogramas de la animación) ; luego sitúa el modelo en la siguiente posición (de un total de 8) y toma nuevas vistas...

Copio y pego esto, que creo que es el script (pienso que es un archivo de texto conteniendo instrucciones en lenguaje Python, sería algo como "crear_vistas.py"):

[code linenumbers=false]# render all animations for the named armature
# Clint Bellanger 2015

import bpy
from math import radians

angle = -45
axis = 2 # z-axis
armature_name = "FemaleArm"

# remember UI settings to restore at the end
original_path = bpy.data.scenes[0].render.filepath
original_frame_end = bpy.context.scene.frame_end

# RenderPlatform is an Empty object located at the origin
# and has the lights and cameras attached as children.
platform = bpy.data.objects["RenderPlatform"]
armature = bpy.data.objects[armature_name]

# Render all animations
for action in bpy.data.actions:

   # make this action the active one
   armature.animation_data.action = action    

   frame_begin, frame_end = [int(x) for x in action.frame_range]
   bpy.context.scene.frame_end = frame_end

   # Render in all 8 facing directions
   for i in range(0,8):

       # rotate the render platform and all children
       temp_rot = platform.rotation_euler
       temp_rot[axis] = temp_rot[axis] - radians(angle)
       platform.rotation_euler = temp_rot;

       # set the filename action and direction prefix
       bpy.data.scenes[0].render.filepath = original_path + action.name + str(i)

       # render animation for this direction
       bpy.ops.render.render(animation=True)

# restore UI settings
bpy.data.scenes[0].render.filepath = original_path
bpy.context.scene.frame_end = original_frame_end[/code]

Si quieres echar un vistazo al sitio de donde lo copio, por si el contexto te orienta un poco:
Blender scripting for Flare animations
"Flare" es el nombre del juego que hace este tipo.
No estoy seguro de si el tipo usa ImageMagick para correr este script, o sólo para montar las vistas en una imagen grande.

En los comentarios (en la parte inferior), dice esto otro sobre el montaje:

CitarI use Imagemagick montage in a shell script / batch file. Here's one I have worked on recently.

del running*9.png
montage -background "transparent" -tile 3x8 -geometry 256x256 Stance*.png _1stance.png
montage -background "transparent" -tile 8x8 -geometry 256x256 Running*.png _2running.png
montage -background "transparent" -tile 2x1 _*.png -geometry x2048 -mode concatenate tilesheet.png

First I delete extra Running frames. It's an 8 frame animation loop, but I have the 9th frame as a keyframe that matches frame #1 so it loops perfectly. I don't actually want to keep that 9th frame, so I remove them. (there's got to be a better way).

The rest is standard montage usage. First I combine all the Stance animations into a 3x8 grid (3 frames, 8 facing directions). Then I combine all the running animations in an 8x8 grid. Then I combine the Stance and Running sheets into one final large sheet with 8 rows.

Lo que yo pretendo es aprender cómo funciona el proceso, para que si un artista no sabe de scripts, el script pueda hacerlo yo. Las vistas obtenidas (sean archivos individuales o un montaje) es lo que mi programa tomaría para fabricar ficheros de recursos de Heroes4.

Namerutan

Por si el script te suena demasiado a chino, te pongo una versión "traducida" (sólo los comentarios y nombres de variables, no pueden traducirse las instrucciones).

[code linenumbers=false]# Crear las vistas de todas las animaciones para el armazón especificado
# Script original por Clint Bellanger, 2015

import bpy                    # esta línea le indica a Blender que cargue el pluggin para scripts Python
from math import radians         # carga el archivo python que contiene funciones con angulos en radianes

angulo = -45
eje = 2                                    # eje-Z
nombre_de_armazon = "ArmazonFemenino"

# Guargar la configuración de la interfaz de usuario, para restablecerla al final
ruta_original = bpy.data.scenes[0].render.filepath
fotograma_fin_original = bpy.context.scene.frame_end

# PlataformaRender es un objeto Vacío posicionado en el origen de coordenadas
# y que tiene todas las Luces y Cámaras adjuntas como hijas
# (padre-hijo es como se denomina un nexo en una estructura de datos de tipo árbol)
plataforma = bpy.data.objects["PlataformaRender"]
armazon = bpy.data.objects[nombre_de_armazon]

# Crear las vistas para todas las animaciones
for accion in bpy.data.actions:

   # hacer que esta acción sea la acción activa
   armazon.animation_data.action = accion    

   fotograma_inicio, fotograma_fin = [int(x) for x in action.frame_range]
   bpy.context.scene.frame_end = fotograma_fin

   # Hacer vistas en todas las 8 direcciones
   for i in range(0,8):

       # Rotar la plataforma de Render y todas sus hijas
       rotacion_temporal = platform.rotation_euler
       rotacion_temporal[eje] = rotacion_temporal[eje] - radians(angulo)
       platform.rotation_euler = rotacion_temporal;

       # Definir el prefijo del nombre de fichero para la acción y dirección
       bpy.data.scenes[0].render.filepath = ruta_original + action.name + str(i)

       # Crear las vistas de animación para esta dirección
       bpy.ops.render.render(animation=True)

# Restablecer la configuración previa de la interfaz de usuario
bpy.data.scenes[0].render.filepath = ruta_original
bpy.context.scene.frame_end = fotograma_fin_original[/code]

Lepastur

Según entiendo, el script se encarga de la producción de las imágenes y ha de ser cargado en Blender. Supongo que la único que aporta son los puntos de vista específicos de la cámara y las luces estándar, de manera que el artista sólo tenga que tener el modelo 3D con las animaciones y las texturas listas (lo cual es la mayor parte del trabajo). En ese sentido, el modelador no tiene por qué saber de scripts, sólo cómo cargarlo, y si acaso la paleta de colores que ha de utilizar a la hora de texturizar (que es lo jodido). No sé qué más quieres saber del "proceso" o qué entiendes tú como tal  :wink:
http://www.rae.es / :worthy: para Krator ¡por ser un campeón! / www.TorredeMarfil.es / Presidente de la plataforma de los Archimagos y Liches flanqueadores de títulos de web.

Namerutan

[quote user="Lepastur" post="80876"]No sé qué más quieres saber del "proceso" o qué entiendes tú como tal  :wink:[/quote]

¿Hace falta un script distinto para cada modelo? No tengo claro si las "acciones" (animaciones, como atacar, defender, esperar...) se definen para el modelo o para los scripts; me parece que se definen para el modelo, y si se definen con el mismo nombre, probablemente se pueda usar el mismo script. ¿Estoy en lo cierto? Si tuvieras que orientar a un nuevo artista a usar un script que tú ya usas, creo que no tendrías problemas, pero si yo hago un script y no tengo mucha idea de modelado, me resultará complicado orientar a un artista  :wink:

Lepastur

[quote user="Namerutan" post="80877"][quote user="Lepastur" post="80876"]No sé qué más quieres saber del "proceso" o qué entiendes tú como tal  :wink:[/quote]

¿Hace falta un script distinto para cada modelo? No tengo claro si las "acciones" (animaciones, como atacar, defender, esperar...) se definen para el modelo o para los scripts; me parece que se definen para el modelo, y si se definen con el mismo nombre, probablemente se pueda usar el mismo script. ¿Estoy en lo cierto? Si tuvieras que orientar a un nuevo artista a usar un script que tú ya usas, creo que no tendrías problemas, pero si yo hago un script y no tengo mucha idea de modelado, me resultará complicado orientar a un artista  :wink:[/quote]
Pues creo que no, el script  sería único porque, como ya te he dicho, parece que solamente configura las cámaras y el procesado en lotes de los renders. Por tanto, el artista imagino que "sólo" tiene que saber la escala del modelo, colocarlo en unas coordenadas determinadas (supongo que el origen) y orientarlo (mirando en sentido -y). Todo eso, claro está, cuando haya hecho el rigging (acoplar el esqueleto a la malla y definir los movimientos) y el unwrapping (desarrollo de la superficie bajo unas condiciones de luz determinadas y "pegarlas" como textura, para que cada render no tenga que hacer cálculo ninguno de luz posteriormente). Vamos, que lo único que hace es ahorrarle al artista 3D configurar las cámaras, el rango de frames y darle al botoncito de render, y poco más, según entiendo (vamos, que hace bien poco en relación al currazo de lo otro, que es lo gordo). En cuanto a las animaciones, pues no tengo ni idea, supongo que internamente tienen un nombre en el archivo de blender, así que básicamente habría 2 opciones, o haces un script "editable" donde el artista pueda indicarle qué animación buscar/ejecutar en blender, o (lo más fácil) es que el artista tenga X escenas (archivos distintos) preparadas con un único movimiento y el script sirva para cada uno.
http://www.rae.es / :worthy: para Krator ¡por ser un campeón! / www.TorredeMarfil.es / Presidente de la plataforma de los Archimagos y Liches flanqueadores de títulos de web.

Namerutan

[quote user="Lepastur" post="80878"](vamos, que hace bien poco en relación al currazo de lo otro, que es lo gordo)[/quote]

Ah, gracias por la información. Pensé que yo podría serle más útil, pero si no merece la pena...

Vitirr

Bueno, son "sólo" 8 renders, pero si yo fuera el artista en cuestión, después del currazo que debe ser según nos comenta Lepas, lo último de lo que tendría ganas es de ponerme a hacer un trabajo manual supercansino para tomarlos. Creo que si se puede hacer que con un único script (que en principio tampoco se ve muy complejo) ese trabajo se automatice para todos los modelos, yo poniéndome en la piel del usuario quedaría sumamente agradecido.

Lepastur

Sí, sobre todo en el asunto de la escala y la posición de la cámara (que están relacionados). No se tarda mucho si se tienen los datos, pero si tienes algo que lo saca del tirón, pues mejor, claro. Además, ten en cuenta que todo esto es algo que me estoy figurando, ya que desconozco exactamente lo que hace el script, y cómo lo hace.
http://www.rae.es / :worthy: para Krator ¡por ser un campeón! / www.TorredeMarfil.es / Presidente de la plataforma de los Archimagos y Liches flanqueadores de títulos de web.

Namerutan

[quote user="Vitirr" post="80880"]Bueno, son "sólo" 8 renders, pero si yo fuera el artista en cuestión, después del currazo que debe ser según nos comenta Lepas, lo último de lo que tendría ganas es de ponerme a hacer un trabajo manual supercansino para tomarlos. Creo que si se puede hacer que con un único script (que en principio tampoco se ve muy complejo) ese trabajo se automatice para todos los modelos, yo poniéndome en la piel del usuario quedaría sumamente agradecido.[/quote]

En realidad son mucho más; son 8 direcciones, pero varias animaciones (acciones). Se toman fotogramas para cada acción y dirección, lo cual significa:
- Para la pantalla de combate: 12 acciones x 8 direcciones = 96 animaciones, cada una con cierta cantidad de fotogramas
- Para la pantalla de aventura: 6 acciones x 8 direcciones = 48 animaciones, cada una con cierta cantidad de fotogramas

La cantidad de fotogramas para una animación es definida por el artista, y varía de una a otra acción para un mismo modelo.
La escala es la misma para una misma pantalla y modelo, osea se definen 2 escalas para cada modelo.

Tomar, de media, 4 fotogramas por animación, supondría unas 400 vistas (renders) para la pantalla de combate, para un sólo modelo.
Es por esto por lo que averiguo si puedo ayudar con la creación de un script.

En el ejemplo que puse, el Wyvern modelado por Clint Bellanger, el tipo hizo 8 x 56 = 448 vistas (8 direcciones, 7 acciones, 8 fotogramas por acción), y las montó luego en una sóla imagen:
(La imagen es enorme, por eso pongo sólo el enlace)
http://opengameart.org/sites/default/files/wyvern_composite.png

Luego repitió el proceso, de forma que obtenía vistas con sombras, vistas sin sombras, y vistas de sólo sombras (sin la imagen).
http://opengameart.org/sites/default/files/wyvern_noshadow.png
http://opengameart.org/sites/default/files/wyvern_shadow.png

Para el Heroes4 habría que tomar vistas de "sólo imagen" y vistas de "sólo sombras", y luego montarlas en un conjunto de ficheros de recursos del juego.
Hablamos de 400 x 2 = 800 vistas para un modelo, para la pantalla de combate. Si las animaciones son más ricas (más fotogramas por animación), la cifra se dispara...

Para montar el conjunto de ficheros de recursos del juego, usando mi programa, sólo deberá especificar la carpeta donde están las vistas, suponiendo que los nombres de subcarpetas y los nombres de imágenes seguirán un patrón predefinido, así como la ruta de la carpeta donde guardar los montajes.
Para crear esa estructura de ficheros y subcarpetas, creo que un script ayudaría mucho.

Y sólo hablamos de un único modelo... si el tipo aún tiene ánimo de modelar otra criatura... :-D

Aún hablando de un único modelo, si tras crear las vistas decide modificar algo en el modelo, hay que tomar de nuevo todas las vistas...

Esto no ha sido aún divulgado: en el spoiler hay una captura de cómo se ve mi programa (aún incompleto), mostrando los fotogramas y la animación de una acción para un modelo.
Sorry but you are not allowed to view spoiler contents.

Lepastur

[quote user="Namerutan" post="80883"]
- Para la pantalla de combate: 12 acciones x 8 direcciones = 96 animaciones, cada una con cierta cantidad de fotogramas
- Para la pantalla de aventura: 6 acciones x 8 direcciones = 48 animaciones, cada una con cierta cantidad de fotogramas
[/quote]
18 acciones diferentes en total, porque lo de las direcciones es lo de menos (basta con configurar las cámaras una vez). Como digo, no es nada en comparación con la preparación del modelo, pero se agradece ya que te quita el tironcillo final. Lo que tengo es un poco de curiosidad por saber es cómo se ajusta la escala de cada criatura y/o la posición de la cámara a tal efecto, o si una vez que tienes el png se ajusta manualmente o algo. Pero vamos, tampoco es que H4 sea santo de mi devoción... con la de cosas guapénticas que se podrían hacer con Heroes V...  :cool:
http://www.rae.es / :worthy: para Krator ¡por ser un campeón! / www.TorredeMarfil.es / Presidente de la plataforma de los Archimagos y Liches flanqueadores de títulos de web.

Namerutan

[quote user="Lepastur" post="80886"][quote user="Namerutan" post="80883"]
- Para la pantalla de combate: 12 acciones x 8 direcciones = 96 animaciones, cada una con cierta cantidad de fotogramas
- Para la pantalla de aventura: 6 acciones x 8 direcciones = 48 animaciones, cada una con cierta cantidad de fotogramas
[/quote]
18 acciones diferentes en total, porque lo de las direcciones es lo de menos (basta con configurar las cámaras una vez). Como digo, no es nada en comparación con la preparación del modelo, pero se agradece ya que te quita el tironcillo final. Lo que tengo es un poco de curiosidad por saber es cómo se ajusta la escala de cada criatura y/o la posición de la cámara a tal efecto, o si una vez que tienes el png se ajusta manualmente o algo. Pero vamos, tampoco es que H4 sea santo de mi devoción... con la de cosas guapénticas que se podrían hacer con Heroes V...  :cool:[/quote]

Pero, ¿cómo haces para tomar las vistas de cada animación para cada posible dirección? ¿Se toman todas con un sólo click? Yo es que nunca he usado un programa de modelado...

Sobre HeroesV, no me gusta, lo siento; ya hay bastante gente trabajando sobre Hereos5 y otras entregas, pero my poca ente lo hace sobre Heroes4, aunque sigo viendo interés en los foros "guiris". Será que me voy haciendo viejo, y me pierdo con tanto movimiento de cámara. No es que esté en contra del 3D, es sólo el modo en que se usa el 3D en Heroes5 y posteriores.

Lepastur

[quote user="Namerutan" post="80887"]Pero, ¿cómo haces para tomar las vistas de cada animación para cada posible dirección? ¿Se toman todas con un sólo click? Yo es que nunca he usado un programa de modelado...[/quote]
Pues con Blender no sé, pero teniendo en cuenta que todos son similares, seguramente tendrá algún "Batch render" (procesado por lotes), en el cual le vas indicando todo: Cámara, resolución, número de Frames, etc (en realidad creo que se le indica el archivo de render donde se especifican todos los detalles) y luego en el batch indicas escena y el archivo ese. Lo dejas trabajando solo durante el tiempo que sea (si has "tostado" las luces como texturas cada render es casi instantáneo) y ya está. Pero ya te digo que tu programita tiene buena pinta y ahorraría bastante trabajo (como por ejemplo obtener sólo la sombra sobre el suelo - tb habría que cuidar sombras arrojadas propias de la criatura, por ejemplo si las alas se mueven, en el texturizado debería estar animado para que se vea esa sombra).

CitarSobre HeroesV, no me gusta, lo siento; ya hay bastante gente trabajando sobre Hereos5 y otras entregas, pero my poca ente lo hace sobre Heroes4, aunque sigo viendo interés en los foros "guiris". Será que me voy haciendo viejo, y me pierdo con tanto movimiento de cámara. No es que esté en contra del 3D, es sólo el modo en que se usa el 3D en Heroes5 y posteriores.
Ya lo sabía, sólo era por picarte  :8O:
http://www.rae.es / :worthy: para Krator ¡por ser un campeón! / www.TorredeMarfil.es / Presidente de la plataforma de los Archimagos y Liches flanqueadores de títulos de web.