Diferencia entre revisiones de «Unity Luces»

De MediaWiki
Ir a la navegación Ir a la búsqueda
Línea 134: Línea 134:
 
==Spot Light==
 
==Spot Light==
  
* Emite la luz siguiendo una forma de cono.
+
* Emite la luz siguiendo una <u>forma de cono</u>.
  
 +
<gallery caption="Creando un SpotLight" widths="350" heights="300px" perrow="2">
 +
Image:Unity3d_luces_18.jpg| Para crear un punto de luz debemos ir: '''Menú principal (o pulsando botón derecho sobre la 'Hierarchy Window') => GameObject => Light => Spot Light'''.
 +
Image:Unity3d_luces_19.jpg| Al igual que en la Point Light podemos modificar su rango gráficamente pulsando sobre el cuadrado central del cono de luz o cambiar su ángulo pulsando sobre los cuadrados que rodean el círculo que representa el área que va a iluminar.
 +
Image:Unity3d_luces_20.jpg| Esas mismas modificaciones las tenemos en la ventana Inspector. Al igual que el tipo de luz anterior también podemos modificar su color, intensidad (directa-indirecta).
 +
Image:Unity3d_luces_21.jpg| Podemos ver como al rotar la luz 90 grados en el eje X y realizar algún ajuste en la intensidad, se visualiza el cono de luz sobre el suelo.
 +
</gallery>
  
  
  
 +
* Como ejercicio vamos a ajustar un SpotLight al modelo de linterna importado.
 +
: Recordar siempre de partir de la posición (0,0,0) y rotación (0,0,0) en todos los modelos y una vez colocados-rotados correctamente, entonces añadirlos dentro de la jerarquía.
  
 +
: Lo que queremos conseguir es lo siguiente:
  
 +
<gallery caption="Ejercicio con un SpotLight" widths="350" heights="300px" perrow="2">
 +
Image:Unity3d_luces_22.jpg| En la jerarquía debemos de tener la Linterna dentro de la cámara y el SpotLight detro de la Linterna. De esta forma, si movemos la cámara o la rotamos, la linterna también rotará y por tanto también el SpotLight.
 +
Image:Unity3d_luces_23.jpg| Al importar el fbx de la linterna deberemos de ajustar la escala y eliminar la importación de luces y cámaras.
 +
Image:Unity3d_luces_24.jpg| Colocaremos la linterna y ajustaremos el SpotLight para conseguir un aspecto similar al siguiente.
 +
</gallery>
  
  
 +
: Creamos el siguiente Script:
 +
<syntaxhighlight lang="java" line enclose="div" highlight="">
 +
using UnityEngine;
  
 +
public class UD3_Luces_Rotar_Linterna : MonoBehaviour
 +
{
 +
    [SerializeField]
 +
    private float velRotacion;
  
 +
    private void Reset()
 +
    {
 +
        velRotacion = 30f;
 +
    }
 +
 +
    // Update is called once per frame
 +
    void Update()
 +
    {
 +
        float valor = Input.GetAxis("Horizontal") * velRotacion * Time.deltaTime;
 +
        transform.Rotate(valor * Vector3.up);   
 +
       
 +
    }
 +
}
 +
</syntaxhighlight>
 +
 +
 +
: Lo asociamos a la cámara y ejecutamos el juego:
 +
<gallery caption="Moviendo la cámara con la Linterna" widths="350" heights="300px" perrow="2">
 +
Image:Unity3d_luces_25.jpg| Asociamos el Script a la cámara.
 +
Image:Unity3d_luces_26.jpg| Al ejecutar, si pulsamos las teclas de cursor izquierda-derecha, veremos como rota la cámara y el efecto de la luz.
 +
Image:Unity3d_luces_27.jpg| Si rotamos vemos como la luz también rota.
 +
</gallery>
 +
 +
 +
 +
 +
 +
 +
<br />
 
* Luces aplicadas a capas
 
* Luces aplicadas a capas
  

Revisión del 10:02 11 jul 2019

Introducción

  • La correcta iluminación de una escena es uno de los aspectos más importantes en el desarrollo de un juego y también uno de los recursos que puedo consumir mayor cantidad de recursos.
Como norma general se recomiendo no abusar del número de luces. Veremos más adelante los tipos de luces, pero se recomienda no tener más de:
  • 4 Directional Light
  • 512 Punctual Lights (point o spot light)
  • 64 Area Lights


  • Las luces y por tanto sus efectos (objetos más iluminados, sombras,...) deben ser calculados por el ordenador.
Estos efectos pueden:
  • O estar previamente calculados y 'guardados' en la escena, por lo que cuando se inicie el juego dichos efectos aparecen, pero no mostrarían modificaciones (por ejemplo, al mover un objeto, la sombra quedaría en la misma posición).
Esta es la técnica empleada en las películas, donde todas las luces y sus efectos son generados por uno o múltiples ordenadores y guardados junto a la película.
  • O estar calculadas en 'Real Time', de tal forma que de manera continua se 're-calculan' los efectos-sombras sobre todos los objetos de la escena (es la opción que más recursos consume).


  • En el desarrollo de videojuegos normalmente se emplean las dos técnicas, de tal forma que se pre-calculan las sombras-efectos sobre aquellos objetos de la escena que no van a modificar su posición-tamaño (proceso que se conoce con el nombre de Lighting Bake y sobre aquellos objetos que se mueven, las sombras-efectos se calculan dinámicamente.


  • Podéis ver en este vídeo la importancia del uso de las luces para conseguir una ambientación correcta en el juego.
En este vídeo se hace uso de una técnica que genera previamente todas las posibles 'rutas' que puedan tener las fuentes de luz sobre los objetos al mover la cámara (una especie de mezcla de las dos técnicas anteriores).
Unity3d luces 1.jpg




Tipos de luces

  • Para explicar los tipos de luces vamos a contruir una nueva escena. La nueva escena tendrá de nombre
Para ello, teniendo previamente descargado e importado el Standar Asset Packages:
Unity3d luces 0.jpg
Descargamos en formato fbx y lo importamos a nuestro proyecto, como ya vimos en una sección de esta wiki



Directional Light-SkyBox

  • Este tipo de luz se crea por defecto al iniciar un proyecto en Unity.
Unity3d luces 2.jpg
  • Una luz ambiental se caracteriza por:
  • Estar en un punto en el espacio. Este tipo de luz se aplica a toda la escena y por lo tanto no importa donde se coloque. El efecto será el mismo.
  • Tener una dirección, que indica la dirección de los rayos de luz, especificada por su rotación.
Viene a ser como los rayos del sol.
Nota: Podemos rotar dicha luz para ver como las sombras de la escena se modifican...
  • Rotando una luz ambiental
  • Luz ambiental con una rotación determinada. Fijarse en la posición de las sombras.

  • Luz ambiental rotada en el eje X. Las sombras han cambiado de posición.


    • Asociado al GameObject se encuentra un componente Light con ciertas propiedades de la luz:
    Unity3d luces 5.jpg
    • Check: Si desactivamos el check, la escena pasará a no tener luz ambiental, por lo que todo quedará oscurecido.
    • Type: Indica el tipo de luz. Veremos posteriormente los diferentes tipos. Ahora mismo marca el tipo de luz => Directional
    • Color: El color de los rayos.
    • Mode: Lo veremos después, pero indica si queremos que los efectos producidos por la luz ambiental (sombras, brillos,...) se calculen previamente (baked) o en tiempo real (por defecto).
    • Intensity: Intensidad del brillo de la luz.
    • Indirect Multiplier: Indica la intensidad del brillo de la luz pero de la luz reflejada por otras superficies al aplicarle la luz ambiental.


    • Para darle un poco más de ambiente a la escena vamos a bajar la intensidad de la luz direccional:
    Unity3d luces 17.jpg



    • Relacionado con la luz ambiental disponemos del SkyBox.
    Hay una sección específica en la Wiki para quien quiera consultarla.
    El SkyBox es el 'espacio' que rodea nuestra escena y que viene a ser el horizonte de la misma.
    Por defecto, aparece el siguiente SkyBox cuando creamos un proyecto en Unity.
    Unity3d luces 6.jpg
    Como vemos es un horizonte que refleja un día despejado y con luz.
    Para ver el SkyBox en la vista escena debemos hacer lo siguiente:
    El SkyBox va a influir sobre el tipo de luz ambiental que se genera, ya que no sería lógico tener un SkyBox de una noche estrellada con una luz ambiental brillante.
    Además va a influir sobre el 'color' de dicha luz, aplicando una especie de 'tinte' a la misma.
    Hagamos un ejemplo utilizando los ejemplos de SkyBox descargados previamente:
    Nota: Si queremos volver al SkyBox por defecto, debemos escoger la opción de menú Window => Rendering => Lighting Settings:
    Unity3d luces 11.jpg
    Aparece una ventana en la que podemos cambiar la opción Source por el SkyBox que queramos. El SkyBox por defecto se llama 'Default-SkyBox'.
    En esta sección solamente vamos a ver los aspectos más importantes en el uso de las luces. Más información sobre el SkyBox en esta sección de la Wiki




    Point Light

    • Las point light son puntos de luz los cuales emiten luz en todas las direcciones pero hasta un determinado alcance.



    • Como ejercicio añadir una luz a cada farola un Point Light y ajustarlo a vuestras preferencias.



    Spot Light

    • Emite la luz siguiendo una forma de cono.


    • Como ejercicio vamos a ajustar un SpotLight al modelo de linterna importado.
    Recordar siempre de partir de la posición (0,0,0) y rotación (0,0,0) en todos los modelos y una vez colocados-rotados correctamente, entonces añadirlos dentro de la jerarquía.
    Lo que queremos conseguir es lo siguiente:


    Creamos el siguiente Script:
     1 using UnityEngine;
     2 
     3 public class UD3_Luces_Rotar_Linterna : MonoBehaviour
     4 {
     5     [SerializeField]
     6     private float velRotacion;
     7 
     8     private void Reset()
     9     {
    10         velRotacion = 30f;
    11     }
    12 
    13     // Update is called once per frame
    14     void Update()
    15     {
    16         float valor = Input.GetAxis("Horizontal") * velRotacion * Time.deltaTime;
    17         transform.Rotate(valor * Vector3.up);     
    18         
    19     }
    20 }
    


    Lo asociamos a la cámara y ejecutamos el juego:





    • Luces aplicadas a capas
    • Sombras
    • Cookies
    • V04_02_V05 Final
    • Optimización de sombras (Ray Cast): Proyectors
    • Guardando una sombra precalculada: Baking



    -- Ángel D. Fernández González -- (2018).