55. CLASE CAMERA (VI)
Render:
function Render () : void
Renderiza la cámara manualmente, usando el clear flags de la cámara, target texture y otras propiedades. La cámara puede enviar mensajes como OnPreCull, OnPreRender o OnPostRender a cualquier script que esté vinculado, y renderizar algunos filtros de imagen.
Esto es usado para tener control preciso sobre el orden de renderizado. Para hacer uso de esta característica, crea una cámara y deshabilitala, y entonces llama a la función Render para ella.
RenderWithShader:
function RenderWithShader (shader : Shader, replacementTag : String) : void
Hace que la cámara renderice con reemplazo de sombreado (shader) . Esto renderizará la cámara, usando los clear flags de la cámara, target texture y otras propiedades. A direrencia de la función anterior, la cámara no enviará OnPreCull, OnPreRender or OnPostRender a scripts vinculados. Los filtros de la imagen tampoco serán renderizados.
Esto es usado para efectos especiales, como por ejemplo renderizar una visión de calor y cosas así. Para usar estas características, habitualmente crearás una cámara y la deshabilitarás y luego llamarás RenderWithShader en ella.
SetReplacementShader:
function SetReplacementShader (shader : Shader, replacementTag : String) : void
Hace que la cámara renderice con shader replacement. Después de llamar a esta función, la cámara renderizará su vista con shader replacement. Para volver al renderizado normal hay que llamar a ResetReplacementShader.
ResetReplacementShader:
function ResetReplacementShader () : void
Borra el shader replacement de la cámara provocado por la función anterior.
RenderToCubemap:
function RenderToCubemap (cubemap : Cubemap, faceMask : int = 63) : boolean
Renderiza un cubemap desde la cámara que llama a esta función. Esto es muy útil en el editor para bakear cubemaps estáticos de tu escena.
La posición de la cámara, clear flags y clipping plane distances son usados para renderizar dentro de las caras de un cubemap. faceMask es un mapa de bits que indica qué cara del cubemap debe ser renderizada. Cada bit se corresponde a una cara y está representado por un int dentro de una enum de tipo cubemapface. Por defecto las seis caras del cube map se renderizarán, que es lo que viene representado en la firma por el 63, que corresponde a lo que ocupan los bits de las seis caras.
La función devuelve false si el renderizado del cubemap falla.
Esta función tiene un segundo prototipo:
function RenderToCubemap (cubemap : RenderTexture, faceMask : int = 63) : boolean
Esta segunda modalidad es usada para reflexiones en tiempo real dentro de render textures de cubemap. Puede ser bastante caro en términos de rendimiento, eso sí, especialmente si las seiz caras del cubemap son renderizadas cada frame.
CopyFrom:
function CopyFrom (other : Camera) : void
Permite copiar para una cámara todas las variables de otra cámara (campo de vision, clear flags, culling mask…) Puede ser útil si queremos que una cámara coincida con la configuración de otra, para conseguir efectos personalizados de rendering, como por ejemplo los objetidos usando RenderWithShader.
VARIABLES DE CLASE:
main:
static var main : Camera
Se refiere a la cámara que esté habilitada y con el tag “Main Camera”(Read Only). Devuelve nulo si no hay una cámara con esas características en la escena.
allCameras:
static var allCameras : Camera[]
Devuelve todas las cámaras habilitadas en la escena.
54. CLASE CAMERA (V)
ViewportToWorldPoint:
function ViewportToWorldPoint (position : Vector3) : Vector3
Es la función inversa a WorldToViewportPoint, que estudiamos en la lección anterior. Convierte por tanto la posición de un transform medida en el viewport space relativo de la cámara (0,0 a 1,1) a coordenadas globales.
Se suministra a la función un vector donde los componentes X e Y son las coordenadas de pantalla, y el componente Z es la distancia del plano resultante desde la cámara en unidades globales, y la función los transforma en coordenadas globales.
Así, podemos adaptar el ejemplo que nos propone el manual de referencia y dibujar una esfera amarilla en la esquina superior derecha de la pantalla, y traducir dichas coordenadas de ubicación a las generales de la escena.
function OnDrawGizmos () {
var deLaCamaraAlMundo : Vector3 = camera.ViewportToWorldPoint (Vector3 (1,1,0.5));
Gizmos.color = Color.yellow;
Gizmos.DrawSphere (deLaCamaraAlMundo, 0.1);
}
Le hemos dado una profundidad a la ubicación de la esfera de 0.5. Hemos de tener presente que esta distancia no debe ser inferior a la que esté establecida en nearClipPlane, o no se verá.
ScreenToWorldPoint:
function ScreenToWorldPoint (position : Vector3) : Vector3
Convierte la posición de un transform desde el espacio de pantalla en píxeles (0,0 a pixelWidth,pixelHeight) a coordenadas globales, con la posición z (como en el resto de casos) medida en unidades globales desde la cámara.
ScreenToViewportPoint:
function ScreenToViewportPoint (position : Vector3) : Vector3
Convierte la posición de un transform de espacio de pantalla en píxeles (0,0 a pixelWidth,pixelHeight) a viewport space relativo al espacio de cámara (0,0 a 1,1).
ViewportToScreenPoint:
function ViewportToScreenPoint (position : Vector3) : Vector3
Convierte la posición del transform de viewport space relativo al espacio de cámara (0,0 a 1,1) en espacio de pantalla en píxeles (0,0 a pixelWidth,pixelHeight). La posición z en ambos tipo de medida es la misma, medida en unidades globales desde la cámara.
ViewportPointToRay:
function ViewportPointToRay (position : Vector3) : Ray
Devuelve un rayo que sale de la cámara en coordenadas relativas a ésta (0,0 a 1,1). El rayo comienza en el plano más cercano a la cámara, razón por la que la posición Z es ignorada.
ScreenPointToRay:
function ScreenPointToRay (position : Vector3) : Ray
Devuelve un rayo que va de la cámara a través de un punto de la pantalla. Estando el rayo en las coordenadas globales, empieza en el plano cercano a la cámara y va a través de la posición x e y en las coordenadas de píxeles (0,0 a pixelWidth,pixelHeight) en la pantalla (la posición z es ignorada.)
53. CLASE CAMERA (IV)
clearFlags:
var clearFlags : CameraClearFlags
Indica cómo la cámara completa el background. Admite los valores CameraClearFlags.Skybox (rellena el bacground con el skybox habilitado), CameraClearFlags.SolidColor (con el color que le indiquemos), CameraClearFlags.Depth (que mantiene el color que tuviera el background el frame anterior o en cualquier estado previo)o CameraClearFlags.Nothing (no se renderiza background alguno).
FUNCIONES:
ResetAspect:
function ResetAspect () : void
Revierte el aspect ratio de la cámara al aspect ratio de la pantalla, acabando con el efecto de modificar la variable aspect.
Lo veremos mejor con un ejemplo (por cierto, si al término del ejemplo anterior no lo hicísteis, aprovechad ahora para volver a marcar el checkbox del componente Camera de Main camera)
Editamos MiSegundoScript para que luzca como sigue:
camera.aspect = 2;
yield WaitForSeconds (5);
camera.ResetAspect();
Lo que estamos haciendo es lo siguiente: primero establecemos la variable aspect en 2. Recordemos que aspect es la anchura de la cámara dividida por la altura, esto es, en este caso la cámara será el doble de ancha que alta (y en consonancia lo grabado será el doble de estrecho de lo normal). Para ver la diferencia, intercalamos una instrucción yield que -como ya sabemos- suspende la ejecución de cualquier otra instrucción (en este caso durante cinco segundos) y acto seguido reseteamos el aspect de la cámara para devolverlo a sus parámetros normales.
WorldToScreenPoint:
function WorldToScreenPoint (position : Vector3) : Vector3
Transforma la posición de un transform desde el espacio global al espacio de la pantalla.
Recordemos que el espacio de la pantalla está definido en píxeles (izquierda-abajo es (0,0) y derecha-arriba es (pixelWidth,pixelHeight). La posición z se calcula en unidades globales desde la cámara.
Un ejemplo. Editamos MiSegundoScript tecleando esto:
var eseQueTuVesAhi : Transform;
var posicionGlobal : String;
var posicionEnPixeles : String;
posicionGlobal = eseQueTuVesAhi.position.ToString();
posicionEnPixeles = camera.WorldToScreenPoint(eseQueTuVesAhi.position).ToString();
Debug.Log("La posicion global es " + posicionGlobal + " y la posicion en pixeles "
+posicionEnPixeles);
Guardamos y arrastramos desde la Jerarquía nuestro Cubo hasta la variable expuesta eseQueTuVesAhi. El script devuelve primero la posición global del cubo en la escena, en un string generado por la función ToString. Acto seguido convertimos ese vector3 que contiene las coordenadas globales en otro Vector3 que contiene la ubicación en píxeles del transform del cubo respecto de la pantalla. Al devolver un Vector3, podemos también aprovechar la función ToString para convertir dichas coordenadas en un String e imprimirlas. Recordemos que el tercer parámetro del Vector3 con la ubicación en píxeles viene referido (eje Z) a la distancia en unidades globales (metros) entre la cámara y el transform.
WorldToViewportPoint:
function WorldToViewportPoint (position : Vector3) : Vector3
Convierte la posición de un transform desde las coordenadas globales al espacio de punto de vista (viewport space en inglés). El viewport space es el relativo a la cámara, donde izquierda-abajo es (0,0) y derecha-arriba (1,1). La posición z se mediría en unidades globales desde la cámara.
Lo vemos con más claridad modificando ligeramente el script anterior:
var eseQueTuVesAhi : Transform;
var posicionGlobal : String;
var posicionEnEspacioCamara : String;
posicionGlobal = eseQueTuVesAhi.position.ToString();
posicionEnEspacioCamara = camera.WorldToViewportPoint(eseQueTuVesAhi.position).ToString();
Debug.Log("La posicion global es " + posicionGlobal + " y la posicion en espacio
normalizado de camara " +posicionEnEspacioCamara);
Como vemos al darle al play, ahora se nos muestra en coordenadas relativas a la cámara la ubicación del transform del cubo. Continúa inalterada, eso sí, la distancia respecto del eje Z (profundidad), que ya dijimos que va medido en unidades globales respecto de la posición de la cámara.
Con la tecnología de Blogger.
BUSCADOR
PÁSATE POR EL FORO
API DE UNITY
TEMAS
- 00_INTRODUCCION (3)
- 01_CLASE OBJECT (3)
- 02_ESTRUCTURA VECTOR3 (4)
- 03_CLASE TRANSFORM (7)
- 04_CLASE RIGIDBODY (8)
- 05_CLASE COLLIDER (2)
- 06_CLASE MESHCOLLIDER (1)
- 07_CLASE CHARACTERCONTROLLER (3)
- 08_CLASE RENDERER (2)
- 09_CLASE MESHFILTER (1)
- 10_CLASE JOINT (2)
- 11_CLASE HINGEJOINT (2)
- 12_CLASE SPRINGJOINT (1)
- 13_CLASE CHARACTERJOINT (1)
- 14_CLASE BEHAVIOUR (1)
- 15_CLASE MONOBEHAVIOUR (9)
- 16_CLASE CAMERA (6)
- 17_CLASE LIGHT (3)
- 18_CLASE MATERIAL (3)
- 19_CLASE CUBEMAP (1)
- 20_CLASE RENDERTEXTURE (3)
- 21_CLASE PARTICLEEMITTER (3)
- 22_CLASE MESH (2)
- 23_CLASE GAMEOBJECT (6)
- 24_CLASE SHADER (1)
- 25_CLASE PHYSICMATERIAL (1)
- 26_CLASE COMPONENT (1)
- 27_CLASE GUIELEMENT (1)
- 28_CLASE GUITEXT (2)
- 29_CLASE GUITEXTURE (1)
- 30_CLASE GUI (8)
- 31_CLASE GUILAYOUT (4)
- 32_CLASE TEXTURE (1)
- 33_CLASE TEXTURE2D (2)
- 34_CLASE INPUT (4)
- 35_ESTRUCTURA BOUNDS (1)
- 36_CLASE COLLISION (1)
- 37_CLASE CONTROLLERCOLLIDERHIT (1)
- 38_CLASE DEBUG (1)
- 39_CLASE EVENT (3)
- 40_CLASE GIZMOS (1)
- 41_CLASE LIGHTMAPSETTINGS (1)
- 42_ESTRUCTURA MATHF (3)
- 43_CLASE PHYSICS (2)
- 44_ESTRUCTURA QUATERNION (1)
- 45_CLASE RANDOM (1)
- 46_ESTRUCTURA RAY (1)
- 47_ESTRUCTURA RAYCASTHIT (1)
- 48_ESTRUCTURA RECT (1)
- 49_CLASE RENDERSETTINGS (1)
- 50_CLASE SCREEN (1)
- 51_CLASE TIME (1)
- 52. CLASE YIELDINSTRUCTION (1)
- MONOGRAFICOS (2)
