Similar a lo vez en juegos como Worms, Hedgewars, Duel of Tanks, etc.
Como es costumbre dejo las ilustraciones, archivos 3D y el dibujo vectorial aquí.
http://www.mediafire.com/file/xeohcauejbw8fa5/Iustraciones_del_Terreno_destructible.zip/file
Comenzamos con modelar, texturizar y exportar el terreno a Godot, usa el programa y la exportación soportadas que mas te agrade, yo usare Blender 2.79 con la exportación a .OBJ
Pasamos todo a nuestro proyecto y arrancamos en Godot.
El agujero
En una escena colocamos un nodo "CSGPolygon", le cambiamos el nombre por: "Agujero".
En la propiedad "Mode", elegimos "Spin" ahora en "Spin Sides" elevamos el valor a "25", mas alto sea este valor mejor se vera el contorno circular y no poligonal pero mas recursos consumirá.
Lo giramos -90 grados, lo agrandamos sobre el eje: "Y" hasta: "2.5", un valor por encima de la profundidad de tu mapa, el mapa que hiciste en 3D.
Pasamos al modo "Ortogonal", con "Vista Superior", movemos el punto rojo para formar un trapecio, que tanto lo muevas determinara en tamaño del contorno que tendrán los agujeros.
Ahora le ponemos un material sin sombreado del color que desees que sean lo contornos del agujero.
En el apartado "CSGShape", en "Operation", cambiamos a "Subtraction", notaran como el materia se vuelve un poco mas claro, esto es para indicarte el cambio, el material no se ha modificado.
El campo
En una nueva escena colocamos:
"Spatial" como nodo raíz, le ponemos el nombre de: "Campo"
"CSGCombiner" como hijo de "Campo", le ponemos el nombre de: "Terreno"
"CSGMesh" como hermano de "Terreno".
Seleccionamos el nodo "Terreno", marcamos la casilla de "Use Collision".
Pasamos al nodo "CSGMesh", cargamos nuestro modelo OBJ.
Ponemos un nuevo material al que le ponemos la textura y quitamos el sombreado.
La bala
En una nueva escena colocamos:
"Spatial" como nodo raíz, le ponemos el nombre de: "Bala", le añadimos un script
"Sprite3D" como hijo de "Bala", le colocamos su textura
"RayCast" como hermano de "Sprite3D".
Clic en el nodo "RayCast", en "Enabled" marcamos la casilla, le damos un tamaño acorde al sentido de la bala y lo alejamos "-0.5" en "Z", para que pueda chocar con el terreno al mismo tiempo que la bala se mantiene visible por el frente, aunque sea 2D recuerda que estamos en 3D.
Ajustamos la forma de la colisión solamente por los ejes: "X" e "Y".
Introducimos las ordenes:
El arma
En una nueva escena colocamos:
"Spatial" como nodo raíz, le ponemos el nombre de: "Arma", le añadimos un script
"Sprite3D" como hijo de "Arma", le colocamos su textura
"Position3D" como hermano de "Sprite3D".
Movemos ligeramente el nodo "Sprite3D", el movimiento en "X" de "-0.5" es para cambiar su punto de rotación y el de "Z" de "-0.1" es para que se coloque por detrás del personaje que la porte.
Movemos ligeramente el nodo "Position3D", el movimiento en "X" de "-0.5" junto con el de "Y" de "0.01" es para alinearlo con el cañón del arma.
El script lleva esto:
El Personaje
En una nueva escena colocamos:
"KinematicBody" como nodo raíz, le ponemos el nombre de: "Personaje", le añadimos un script
"Sprite3D" como hijo de "Personaje", le colocamos su textura
"CollisionShape" como hermano de "Sprite3D", le ponemos una forma cúbica
Enlazamos el arma anteriormente creada.
Ajustamos la colisión solo en los ejes X e Y, después su Posición para que quede pegada al personaje.
Le agregamos la acción "ui_saltar" a la tecla "Shift"
Guion:
La escena principal
En una nueva escena colocamos:
"Spatial" como nodo raíz, le ponemos el nombre de: "Mostrar"
"Camera", como hijo de "Mostrar"
"Sprite3D" como hermano de "Camera", le ponemos el nombre de: "Fondo", le colocamos su textura
enlazamos la escena de "Campo"
enlazamos al "Personaje"
Seleccionamos la cámara, cambiamos "Proyection" a "Orthogonal", alejamos la cámara un poco deslizando sobre el eje "Z" en "3" y en "Size" elevamos hasta ver completamente el escenario, en este caso basta con elevarlo hasta: "5.7".
Movemos el campo ligeramente hacia abajo para que de la impresión de estar encima del agua
Movemos al personaje, el movimiento en "Z" es ligero, no mucho, solo lo suficiente como para que se aprecie el arma completamente.
¡Listo!
http://www.mediafire.com/file/572y65kclz3e7tt/Terreno_destructible.zip/file
Nota:
Evita los agujeros pequeños y/o muy juntos suelen conducir a un mal funcionamiento.
En terrenos mas grandes con muchos agujeros VISIBLES se puede empezar a poner lento.
Puedes mejorar el rendimiento bajando el número de "Spin Sides" del "Agujero".
Si destruyes absolutamente TODO el terreno, Godot devolverá una error.
Las balas normalmente se hacen con el nodo "Area", pero al día que se escribe esto, Godot esta en la versión 3.2 y en esta versión el Nodo "Area" no detecta las colisiones con los nodos de "CSG", desconozco si es torpeza mía o es Godot y si es Godot esperemos que lo implementes en versiones futuras.
Pude haber usado un "RigidBody" para la bala pero no es muy bueno para detectar con que choca, aveces en vez de devolver con que choca se desliza o rebota, de esa forma no registra la colisión.
Como lo mencione en la primera publicación de este blog, los modelos que hagas en Blender deben estar perfectamente centrados en todos los ejes para tener una correcta exportación a OBJ y por ende a Godot.
En estos momentos se me ocurren otras dos formas de hacer terreno destructible:
-Una es integrar, o buscar, o hacer una librería de recorte de polígonos 2D, de esa forma no es necesario tocar el 3D, lo harías directamente en 2D, recortando las colisiones, no use este método por que CSG ya viene incluido y listo.
-Otra forma seria dibujar sobre el mapa los agujeros, el personaje caminaría sobre los píxeles de la imagen y no sobre las formas de colisión de Godot, mas grande la imagen mas se elevaría el consumo de memoria RAM, además tendrías que crear un motor de física basado en el choque de píxeles.
Como es costumbre dejo las ilustraciones, archivos 3D y el dibujo vectorial aquí.
http://www.mediafire.com/file/xeohcauejbw8fa5/Iustraciones_del_Terreno_destructible.zip/file
Comenzamos con modelar, texturizar y exportar el terreno a Godot, usa el programa y la exportación soportadas que mas te agrade, yo usare Blender 2.79 con la exportación a .OBJ
Pasamos todo a nuestro proyecto y arrancamos en Godot.
El agujero
En una escena colocamos un nodo "CSGPolygon", le cambiamos el nombre por: "Agujero".
En la propiedad "Mode", elegimos "Spin" ahora en "Spin Sides" elevamos el valor a "25", mas alto sea este valor mejor se vera el contorno circular y no poligonal pero mas recursos consumirá.
Lo giramos -90 grados, lo agrandamos sobre el eje: "Y" hasta: "2.5", un valor por encima de la profundidad de tu mapa, el mapa que hiciste en 3D.
Pasamos al modo "Ortogonal", con "Vista Superior", movemos el punto rojo para formar un trapecio, que tanto lo muevas determinara en tamaño del contorno que tendrán los agujeros.
Ahora le ponemos un material sin sombreado del color que desees que sean lo contornos del agujero.
En el apartado "CSGShape", en "Operation", cambiamos a "Subtraction", notaran como el materia se vuelve un poco mas claro, esto es para indicarte el cambio, el material no se ha modificado.
El campo
En una nueva escena colocamos:
"Spatial" como nodo raíz, le ponemos el nombre de: "Campo"
"CSGCombiner" como hijo de "Campo", le ponemos el nombre de: "Terreno"
"CSGMesh" como hermano de "Terreno".
Seleccionamos el nodo "Terreno", marcamos la casilla de "Use Collision".
Pasamos al nodo "CSGMesh", cargamos nuestro modelo OBJ.
Ponemos un nuevo material al que le ponemos la textura y quitamos el sombreado.
La bala
En una nueva escena colocamos:
"Spatial" como nodo raíz, le ponemos el nombre de: "Bala", le añadimos un script
"Sprite3D" como hijo de "Bala", le colocamos su textura
"RayCast" como hermano de "Sprite3D".
Clic en el nodo "RayCast", en "Enabled" marcamos la casilla, le damos un tamaño acorde al sentido de la bala y lo alejamos "-0.5" en "Z", para que pueda chocar con el terreno al mismo tiempo que la bala se mantiene visible por el frente, aunque sea 2D recuerda que estamos en 3D.
Ajustamos la forma de la colisión solamente por los ejes: "X" e "Y".
Introducimos las ordenes:
El arma
En una nueva escena colocamos:
"Spatial" como nodo raíz, le ponemos el nombre de: "Arma", le añadimos un script
"Sprite3D" como hijo de "Arma", le colocamos su textura
"Position3D" como hermano de "Sprite3D".
Movemos ligeramente el nodo "Sprite3D", el movimiento en "X" de "-0.5" es para cambiar su punto de rotación y el de "Z" de "-0.1" es para que se coloque por detrás del personaje que la porte.
Movemos ligeramente el nodo "Position3D", el movimiento en "X" de "-0.5" junto con el de "Y" de "0.01" es para alinearlo con el cañón del arma.
El script lleva esto:
El Personaje
En una nueva escena colocamos:
"KinematicBody" como nodo raíz, le ponemos el nombre de: "Personaje", le añadimos un script
"Sprite3D" como hijo de "Personaje", le colocamos su textura
"CollisionShape" como hermano de "Sprite3D", le ponemos una forma cúbica
Enlazamos el arma anteriormente creada.
Ajustamos la colisión solo en los ejes X e Y, después su Posición para que quede pegada al personaje.
Le agregamos la acción "ui_saltar" a la tecla "Shift"
Guion:
La escena principal
En una nueva escena colocamos:
"Spatial" como nodo raíz, le ponemos el nombre de: "Mostrar"
"Camera", como hijo de "Mostrar"
"Sprite3D" como hermano de "Camera", le ponemos el nombre de: "Fondo", le colocamos su textura
enlazamos la escena de "Campo"
enlazamos al "Personaje"
Seleccionamos la cámara, cambiamos "Proyection" a "Orthogonal", alejamos la cámara un poco deslizando sobre el eje "Z" en "3" y en "Size" elevamos hasta ver completamente el escenario, en este caso basta con elevarlo hasta: "5.7".
Movemos el campo ligeramente hacia abajo para que de la impresión de estar encima del agua
Movemos al personaje, el movimiento en "Z" es ligero, no mucho, solo lo suficiente como para que se aprecie el arma completamente.
¡Listo!
http://www.mediafire.com/file/572y65kclz3e7tt/Terreno_destructible.zip/file
Nota:
Evita los agujeros pequeños y/o muy juntos suelen conducir a un mal funcionamiento.
En terrenos mas grandes con muchos agujeros VISIBLES se puede empezar a poner lento.
Puedes mejorar el rendimiento bajando el número de "Spin Sides" del "Agujero".
Si destruyes absolutamente TODO el terreno, Godot devolverá una error.
Las balas normalmente se hacen con el nodo "Area", pero al día que se escribe esto, Godot esta en la versión 3.2 y en esta versión el Nodo "Area" no detecta las colisiones con los nodos de "CSG", desconozco si es torpeza mía o es Godot y si es Godot esperemos que lo implementes en versiones futuras.
Pude haber usado un "RigidBody" para la bala pero no es muy bueno para detectar con que choca, aveces en vez de devolver con que choca se desliza o rebota, de esa forma no registra la colisión.
Como lo mencione en la primera publicación de este blog, los modelos que hagas en Blender deben estar perfectamente centrados en todos los ejes para tener una correcta exportación a OBJ y por ende a Godot.
En estos momentos se me ocurren otras dos formas de hacer terreno destructible:
-Una es integrar, o buscar, o hacer una librería de recorte de polígonos 2D, de esa forma no es necesario tocar el 3D, lo harías directamente en 2D, recortando las colisiones, no use este método por que CSG ya viene incluido y listo.
-Otra forma seria dibujar sobre el mapa los agujeros, el personaje caminaría sobre los píxeles de la imagen y no sobre las formas de colisión de Godot, mas grande la imagen mas se elevaría el consumo de memoria RAM, además tendrías que crear un motor de física basado en el choque de píxeles.
Si deseas exportar a Android sustituye todos los nodos "Sprite3D" por nodos "MesInstance" con malla "QuadMesh"
Comentarios
Publicar un comentario