103. ESTRUCTURA BOUNDS




Como es fácil apreciar, Bounds no es una clase, sino una estructura. La diferencia, aunque a efectos prácticos una clase es lo mismo que una estructura, es más de tipo semántico. Esto es, cuando nos topamos con una estructura, se nos quiere informar de que la misma tiene un componente de complemento a una o varias clases que no suelen tener las clases en sí.

La estructura bounds representa una caja de bordes con los ejes alineados. También denominada AABB (para abreviar axis-aligned bounding box), es una caja alineada con los ejes de coordenadas globales que envuelve algún objeto.

Como la caja nunca rota respecto de los ejes, puede ser definida por su centro y extensiones, o alternativamente por mínimo y máximo. (center, extents, min y max, en inglés)

La estructura Bounds se usa en Collider.bounds, Mesh.bounds y Renderer.bounds.


VARIABLES:

center:

var center : Vector3

El centro de la caja.


size:

var size : Vector3


El tamaño total de la caja. Es siempre dos veces más grande que las extensiones (extents)


extents:

var extents : Vector3


Las extensiones de la caja. Es siempre la mitad del tamaño (size)


min:

var min : Vector3


El punto mínimo de la caja. Es siempre igual a center – extents.


max:

var max : Vector3


El punto máximo de la caja. Siempre es igual a center+extents.


FUNCIONES:

static function Bounds (center : Vector3, size : Vector3) : Bounds


Crea una nueva caja de bordes con un centro dado y un tamaño total. Las extensiones deben ser la mitad del tamaño dado.


SetMinMax:

function SetMinMax (min : Vector3, max : Vector3) : void


Establece los bordes en los valores mínimos y máximos de la caja. Usar esta función es más rápido que asignar min y max de manera separada.


Encapsulate:
function Encapsulate (point : Vector3) : void
function Encapsulate (bounds : Bounds) : void


Incrementa la caja para incluir el punto que se pasa como parámetro (1er prototipo) o para incluir la nueva caja (2º prototipo)


Expand:

function Expand (amount : float) : void
function Expand (amount : Vector3) : void


Expande la caja para incrementar su tamaño en una cantidad a lo largo de cada cara.


Intersects:

function Intersects (bounds : Bounds) : boolean


¿Hay alguna otra caja intersectando nuestra caja?


Contains:

function Contains (point : Vector3) : boolean


¿Está el punto point contenido en la caja?


sqrDistance:

function SqrDistance (point : Vector3) : float

El cuadrado de la distancia entre el punto point y la caja.


intersectRay:

function IntersectRay (ray : Ray) : boolean


¿El rayo ray intersecta esta caja?

Pongamos un ejemplo. Previamente ubicamos la esfera (que es el gameobject al que tenemos vinculado nuestro script) en la posicion (2,0,2), y le añadimos de nuevo un componente Rigidbody.

Ahora reeditamos MiPrimerScript así:


var rayo : Ray = new Ray (Vector3.zero, Vector3.forward);;

function Update () {
Debug.DrawRay (Vector3.zero, Vector3.forward * 999, Color.green);
var bordes : Bounds = transform.collider.bounds;
if (bordes.IntersectRay (rayo))
Debug.Log("La caja tocó el rayo");
}

function FixedUpdate() {
rigidbody.AddForce(-Vector3.right*6*Time.deltaTime);
}


Creamos primero un rayo que surge en el centro global de la escena y se prolonga a lo largo del eje z positivo (vulgarmente, hacia delante). Ya dentro de la función update dibujamos ese mismo rayo que ya tenemos descrito, para que visualmente podamos seguir lo que está pasando. Acto seguido creamos una instancia de la estructura Bounds que en un alarde de originalidad llamaremos bordes, y la inicializaremos con la caja de bordes del collider de nuestro gameobject (la caja que envuelve el collider, ojo, no confundir con el collider mismo. En este caso el collider tiene forma de escena y el Bounds de la esfera sigue teniendo forma de caja). Dejamos establecido que si la caja toca el rayo se mostrará un mensaje en pantalla, así que sólo nos queda darle movimiento a la esfera para que cuando intersecte el rayo (que aquí hemos dibujado a través de DrawRay, pero que podríamos haber dejado invisible) se muestre dicho mensaje.

POSTED BY UnityScripts
DISCUSSION 0 Comments

Leave a Reply

Con la tecnología de Blogger.