Test #1 de ambientación en Unity: Dia-noche

Pocos días atrás tuve una breve entrevista con una empresa especializada en ilustración arquitectónica en 3D, quienes quieren hacer un walkthrough por el modelo de una casa y alrededores. Desean presentar un producto de gran calidad gráfica y -en esto hicieron mucho énfasis- ambientación, por decirlo de alguna manera... quieren que tenga "vida". Una de las ideas varias para enriquecer la escena es la posibilidad de representarla tanto de día como de noche, y de eso se trata esta pequeña demo.

Usa las flechas o AWSD para caminar el mouse para mirar, Enter para cambiar día-noche

Otros detalles de ambientación que pueden verse en esta escena son pequeñas animaciones como el agua o la puerta (con cual hay una sencilla interacción con el usuario) y features gráficas como el uso de luces y destellos (lens flare) del sol y farolitos.

Como cambiar Dia-Noche en Unity?

Básicamente... para hacer el cambio día-noche necesitamos cambiar el skybox y modificar las propiedades de las luces en escena.

La primera solución que probé para el cambio de skybox fue un simple reemplazo de materiales del mismo, usando la siguiente función

RenderSettings.skybox= nightMaterial;
Un sencillo ejemplo de uso sería el siguiente:
var dayMaterial:Material;
var nightMaterial:Material;
private var ButtonText:String ="day";
RenderSettings.skybox = dayMaterial;

function OnGUI () {
   if (GUI.Button (Rect (10,10,150,50), ButtonText)) {
      if (RenderSettings.skybox == dayMaterial){
         ButtonText = "night";
         RenderSettings.skybox= nightMaterial;
      }else if(RenderSettings.skybox == nightMaterial){
         ButtonText = "day";
         RenderSettings.skybox= dayMaterial;
      }
   }
}
Para probar este script, copia y pegalo en un objeto JavaScript de Unity, asigna el mismo a cualquier objeto en escena (la cámara, por ejemplo), y asígnale 2 materiales diferentes de tipo skybox (si no encuentras ninguno, prueba importar el package Skyboxes que viene con los Standard Assets de Unity) a las variables Day Material y Night Material.

El único drama con esta propuesta es que el cambio instantáneo resulta bastante brusco, lo cual, al menos en mi opinión... se hace demasiado notorio, especialmente tratándose del cielo.

Haciendo un fade (fundido) de un cielo a otro

La segunda solución, y la que finalmente fuera adoptada en la demo, es hacer un fundido de un cielo a otro.

Para encarar esto recurrí a un shader escrito especialmente para dicho propósito: SkyboxBlended. Al aplicar este shader a un material, se nos presentan 12 slots -correspondientes a 2 skybox- para completar con texturas. Adicionalmente, en la parte superior tenemos una barra de desplazamiento para cambiar el valor de Blend del material, que controla el fundido. El siguiente paso sería acceder a este valor Blend via script, de modo que pueda automatizarse el cambio progresivo del mismo.

Para ello creamos una variable de tipo Material a la cual asignamos el nuevo material creado con el shader SkyboxBlended, y accedemos al valor Blend del shader de la siguiente manera:

variableMaterialSkyboxBlended.SetFloat("_Blend", valiable float con valor entre 0-1);

Modificando las luces en escena

Para modificar la intensidad de las luces en escena necesitamos crear una variable de tipo Light a la cual asignamos el objeto luz con el cual vamos a trabajar, ej:

var luzSol:Light;
Y modificamos la intensidad accediendo a su variable Intensity. La siguiente linea de ejemplo bajaría la intensidad de la luz "Sol" a 0.
luzSol.intensity=0;
Puedes ver mas sobre el manejo de las luces via script aquí: luces en Unity.

Mini-escena test

Update 14/10/2011

Siguiendo una conversación desarrollada en los comentarios, he armado esta mini escena test. Puedes bajar el ZIP aquí: dia-noche-test1/test-skybox.zip
Si descomprimimos el ZIP dentro de la carpeta Assets de un proyecto nuevo, *supuestamente* debería funcionar, habiendo únicamente que agregar las texturas al material. De no funcionar *así nomás* (es decir, los objetos en la escena aparece en blanco y hay que agregarles los assets), el ZIP al menos contiene un script JS y el shader, con los cuales es muy fácil montarse el proyecto.

Tweet

blog comments powered by Disqus


2/2/2011 - loop, fantarama.com