Diferencia entre revisiones de «UNITY Cámara en perspectiva»
Ir a la navegación
Ir a la búsqueda
Imagen obtenido de esta web
| Línea 260: | Línea 260: | ||
<br /> | <br /> | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
<br> -- [[Usuario:angelfg|Ángel D. Fernández González]] -- (2018). | <br> -- [[Usuario:angelfg|Ángel D. Fernández González]] -- (2018). | ||
Revisión del 10:49 29 ago 2019
Sumario
Introducción
- Preparación:
- Crea una nueva escena de nombre Escena_UD2_Camara_Perspectiva
- La cámara va a ser nuestros ojos. Van a mostrar la escena como si estuviéramos nosotros viendo con nuestros ojos los objetos 3D dibujados a nuestro alrededor.
- En el desarrollo de videojuegos podemos hacer uso dos tipos de cámara diferentes:
- Cámara ortográfica: Utilizada en los juegos 2D.
- Cámara en perspectiva. Utilizada en los juegos 3D.
- En este punto vamos a tratar solo la cámara en perspectiva.
Cámara en perspectiva
- Este tipo de cámara va a 'dibujar' los objetos en perspectiva, en función de la distancia, de tal forma que los objetos más cercanos se verán más grandes y los objetos más lejanos se verán más pequeños.
- En este gráfico, la cámara estaría situada en en cuadrado más pequeño, mirando cara a los triángulos. Después explicaremos más en detalle.
- Como vemos existen dos triángulo, el triángulo rojo está delante del verde, por lo tanto debe de verse mayor (los dos tienen el mismo tamaño).
- Veamos el resultado:
- Veamos un poco más en detalle los parámetros que conforman una cámara en perspectiva.
Cámara en perspectiva en Unity
- Al crear un nuevo proyecto, Unity añade al mismo una cámara por defecto, de nombre Main Camera.
- Si pulsamos sobre ella podemos ver que aparece una ventana denominada Camera Preview que nos muestra como el usuario vería nuestro juego. Sería igual a que si pulsamos sobre la 'Game Window'.
- Al igual que cualquier GameObject de la escena vamos a poder mover la cámara o rotarla en cualquiera de sus tres ejes, accedediendo a su propiedad Transform.
- También vamos a poder colocar la cámara como 'hija' de cualquier GameObject en la jerarquía, pudiendo conseguir que la cámara se mueva al mismo tiempo que un 'protagonista'.
- Veamos un ejemplo:
- Preparación previa:
- Crea una escena de nombre Escena_UD2_Camara3D_1 y guárdala en la carpeta Scenes dentro de Assets en la ventana Project Window.
- Dentro de la escena crea la siguiente jerarquía de GameObjects:
- Un plano en la posición (0,0,0) (recuerda pulsar el botón 'Reset' después de añadirlo a la escena, como ya vimos en esta Wiki)
- Una esfera en la posición (-3,1,-2)
- La cámara en la posición (-2,1,-7) dentro del GameObject Sphere. Recordar que al añadirlo al interior de la jerarquía, la posición es relativa al objeto padre, en este caso la esfera.
- Nota: Las posiciones podéis cambiarlas a vuestro gusto.
- Si ahora, movéis la esfera en la 'vista Scene' (aún no sabemos crear el programa que permite mover al protagonista) veréis que la cámara también se mueve, al ser hija en la jerarquía.
- Nota: Hay que tener cuidado con este recurso, ya que la cámara también se verá afectada por la rotación del objeto padre (la esfera).
- Probar a rotar en ejecución la esfera en cualquiera de los ejes y veríes como la cámara también rota. Esto normalmente en un juego no queremos que ocurra.
Parámetros de una cámara en perspectiva
- En la imagen anterior el ojo representa a una cámara.
- Como vemos, de él 'surgen' rayos formando un pirámide que se va abriendo hasta el infinito.
- Cuando configuramos una cámara en perspectiva podemos determinar desde que punto y hasta que punto se visualizan los objetos.
- Fuera de estas dos 'distancias' los objetos no se dibujarán.
- Esos dos puntos en la figura que representa el área de visualización (como una pirámide aumentando de tamaño), forman dos planos que es lo que se conoce como el plano near (el situado en el punto más cercano) y el plano far (el situado en el punto más alejado)
- El área de visualización (lo que va a dibujar la cámara) se conoce como view frustum.
- Normalmente cuando definimos una cámara 3D indicamos un punto muy cercano (por ejemplo, 0.3) y un punto muy lejano (1000) aunque este último va a depender del tipo de juego. Recordar que estamos hablando de 'unidades' en el mundo 3D que son los cuadrados que se ven en el suelo.
- ¿ Por qué limitar el área de visualización ? Para ahorrar recursos. Ten en cuenta que un objeto 3D muy alejado no será apreciado por la vista, pero el ordenador seguirá dibujándolo aunque no lo veas.
- Existe otro parámetro que es el Field of View => FOV
- Este parámetro es un ángulo y representa el ángulo de visión de la cámara sobre la proyección de los objetos.
- Viene a ser como la apertura del objetivo de una cámara. Cuanto más grande, más abarcamos.
- El valor por defecto es de 60 grados, pero dependiendo del juego puede ser que nos interese aumentarlo, como en los juegos de primera persona.
- Cabe señalar que al disminuir el ángulo conseguimos un 'efecto zoom' como se ve en la imagen anterior.
- IMPORTANTE: En la cámara en perspectiva tiene que cumplirse que 0 < near < far.
- Por último tenemos el viewport.
- En una cámara 3D, el viewport va a establecer la relación de aspecto (la relación que existe entre el ancho y el alto de la pantalla). Hablaremos de esto en el siguiente punto.
- Indicar que en una cámara en perspectiva, el viewport va 'creciendo en tamaño' a medida que se aleja, a diferencia del viewport en una cámara ortográfica (2D) que siempre tiene el mismo tamaño.
- En Unity3D podemos seleccionar la cámara en le ventana de jerarquía y podremos observar los valores de todos estos parámetros en la ventana inspector:
- Podemos observar:
- FOV tiene un valor de 60 grados.
- El plano near está situado a 0.3 unidades de la cámara y el plano far a 1.000 unidades de la cámara. Por lo tanto la cámara va a 'dibujar' los objetos situados entre 0.3 y 1000 (es el view frustum)
- La relación de aspecto va a ser 1 a 1 (valor del viewport). Vamos a explicar un poco más los valores del ViewPort:
- Los valores (X,Y) del viewport se mueven entre 0-1 con decimales, separados por punto. Indican la posición del Viewport (lo que se va a visualizar) en la pantalla, siendo la posición (0,0) abajo-izquierda y (1,1) arriba-derecha. Así el valor (0.5,0) desplazaría el viewport hasta la mitad de la pantalla, apareciendo una banda negra por la izquierda.
- Los valores W,H pueden tener cualquier valor ya que indican la relación de aspecto, pero Unity va a ajustar la imagen a cualquier pantalla al generar el ejecutable del juego. Si ponemos unos valores inferiores a 1 (entre 0-1 con decimales) tendremos el efecto de 'ver' el viewport en pequeño, siendo el valor 0 en el que no se ve nada y el valor 1 en el que el viewport ocupa toda la pantalla. Así, un valor de (0.5,1) haría que el viewport visualizara la mitad de la pantalla de ancho.
- Nota: Los parámetros Clear Flags y Culling Mask los veremos en la sección SkyBox y en la sección de sombras aplicadas a luces de esta Wiki.
- Si seleccionamos la cámara en la ventana de jerarquía podemos ver en la ventana de escena el área de visualización de la cámara que viene representado por unas líneas blancas que surgen de ella formando una pirámide:
Relación de aspecto
- Todos estamos 'cansados' de escuchar algo como: Me voy a comprar una televisión 16:9, o voy a comprarme un monitor 16:10
- Estos números representan la relación que existe entre el ancho (primer número) y el alto (segundo número)
- Cuando alguien filma una película lo hace utilizando la cámara con una relación de aspecto determinada.
- ¿ Qué pasa cuando intentamos visualizar lo filmado en una televisión con una relación de aspecto diferente a la original ?
- Que aparecen las temidas bandas negras :)
- Esto es así para que la película no se deforme:
- En esta imagen, el ancho se ha duplicado, pero la altura no, por lo que la imagen aparece 'deformada'.
- En juegos pasa algo parecido, con la ventaja que los objetos son dibujados en el momento que se juega (no está filmado previamente, bueno, aunque puede ser que haya escenas animadas previamente hechas).
- Lo que tenemos que tener claro es que la cámara tiene una relación de aspecto que se lo da el ViewPort en su valores W y H:
- Esa relación de aspecto no tiene que ver con el dispositivo físico donde se va a ejecutar el juego.
- Así, si ejecuto el juego en una pantalla con 16:9, en principio se vería deformado.
- Para evitarlo, Unity (si no tocamos los valores por defecto) ajustará, al iniciar el juego, el ViewPort al tamaño de la pantalla para mantener la relación de aspecto.
- En el caso de los juegos 3D esto llevará consigo que se verán diferentes zonas.
- Podemos comprobar como quedaría el juego con diferentes relaciones de aspecto en Unity.
- En este ejemplo, la pantalla donde se probaría el juego tiene una relación 16:9 mientras que el juego se estaría ejecutando con una resolución 4:3 (Unity permite establecer la resolución con la que se juega el juego que no tiene por qué coincidir con la pantalla completa.
- Si cambiamos la relación de aspecto a 16:9 vemos que el juego ocupa toda la pantalla (tenéis que cambiar el tamaño de la ventana Game para que el juego ocupe todo):
Layers
- Más información en este enlace.
- Las Capas o Layers son un recurso que nos proporciona Unity gracias al cual vamos a poder asociar a cada GameObject de la escena una capa.
- Cada capa está referenciada por un nombre.
- De esta forma el uso de capas nos va a permitir:
- Que una determinada cámara solo visualice (dibuje) los gameobjects que estén asociados a la capa indicada.
- Cuando veamos los 'rayos' a continuación, veremos que el uso de capas nos va a permitir restringir la detección de colisiones solo a los gameobjects que se encuentren en una capa determinada.
- Que las luces solo tengan efecto (iluminen) aquellos objetos que se encuentren en una determinada capa.
- Por defecto ya existen una serie de capas creadas y nosotros podemos añadir las que queramos hasta un máximo de 32.
- Layers
Avanzado
Trabajando con varias cámaras a la vez
- Lo visto anteriormente nos puede servir para crear juegos en los que tengamos que hacer uso de varias cámaras.
- Crea una nueva escena de nombre Escena_UD2_CamaraPerspectiva_DosCamaras y cárgala presionando dos veces sobre ella.
- Sigue los siguientes pasos:
- Creando un espejo retrovisor
Ponemos los valores indicados X,Y,W,H del viewport de la cámara 'VistaTrasera'. Podéis probar a cambiarlos para ver el efecto. Si estáis en la ventana Game podéis ver como se visualizan las dos cámaras. Indicar que cuando tenemos varias cámaras, la propiedad depth nos va a indicar cual es la cámara que va a visualizarse en el juego. La que tenga el valor mayor será la cámara 'activa'. Si tenemos varias y no ocupan toda la pantalla, se podrán visualizar a la vez como en el ejemplo.
- Indicar que podemos mejorar el efecto y tener una imagen 'dentro de la cual' tendríamos la imagen de la cámara.
- Imaginar un espejo o un retrovisor de un coche...
- Para ello tendríamos que hacer uso de un Render Texture.
- Nota: Vuelve a cargar la escena Escena_UD2_CamaraPerspectiva.
- Cuando trabajamos sobre el mundo 3D, hablamos de coordenadas (x,y,z) sin embargo nuestra cámara está visualizando 'pixeles' sobre una pantalla 2D (ancho-alto).
- Es necesario tener algún mecanismo que nos permita 'pasar' de coordenadas de nuestro mundo (world cooordinates) a coordenadas de nuestra cámara (screen space).
- Veamos las dos operaciones.
-- Ángel D. Fernández González -- (2018).

