14. CLASE TRANSFORM (V)










RotateAround:

function RotateAround (point : Vector3, axis : Vector3, angle : float) : void


Esta función nos permite que nuestro transform rote alrededor de un punto (u objeto situado en ese punto), como si orbitara.

El parámetro point sería el punto, descrito por un Vector3, alrededor del cual queremos hacer girar nuestro transform. Axis nos servirá para indicar sobre qué eje queremos girar, y angle el número de grados por frame (si está dentro de la función update) o por segundo (si implicamos la variable de clase Time.deltaTime) que queremos que gire. Obviamente, aquí estamos variando tanto la rotación como la posición de nuestro transform.

si por ejemplo quiriéramos que nuestro cubo girara sobre su eje Y alrededor del centro exacto del espacio global, a razón de 20 grados por segundo, escribiríamos este script:

 
function Update() {
transform.RotateAround (Vector3.zero, Vector3.up, 20 * Time.deltaTime);
}


Dado que el cubo se hallaba ya en las coordenadas globales 0,0,0 el script anterior lo único que consigue es que el cubo parezca girar sobre sí mismo. Vamos a hace lo siguiente: colocamos en el inspector a nuestro cubo en position.x = -1, y volvemos a darle al play.

Y vemos ya más claramente cómo orbita alrededor del punto dado, cambiando simultáneamente de posición y de rotación.

Podemos hacer también con esta función que un objeto orbite alrededor de otro. Escribimos:


var centroDeGravedad: Transform;

function Update() {
transform.RotateAround (centroDeGravedad.position, Vector3.up, 20 * Time.deltaTime);
}


Acto seguido, arrastramos el objeto sobre el que queremos que orbite nuestro cubo, en este caso la cápsula. Le damos al play y comprobamos.

Observemos que aunque arrastramos un gameobject, lo que está esperando nuestro scrips es un transform. Lo que sucede es que -tal como vimos en las primeras lecciones- todos los componentes de nuestro gameobject comparten nombre, de tal manera que cuando en casos como este Unity detecta que uno de los componentes del gameobject que le estamos arrastrando tiene el nombre y el tipo del que está esperando para cumplimentar una variable, automáticamente selecciona -en este caso- el transform homónimo y no el gameobject.

Ese transform, no obstante, no es del tipo Vector3 que espera nuestra función. Sí que lo es la variable position del mismo, que además contiene las coordenadas globales del transform sobre el que queremos orbitar.

Podéis probar a sustituir en el segundo parámetro Vector3.up por Vector3.right (o Vector3.forward), y comprobar qué es lo que sucede.


LookAt:

function LookAt (target : Transform, worldUp : Vector3 = Vector3.up) : void


El nombre de esta función se podría traducir al castellano como "mira a", y es exactamente eso lo que hace: Rotar nuestro transform hacia un objetivo -parámetro target- que es asimismo de tipo transform (y no Vector3, como en el caso de la función anterior). Esa rotación se efectúa sobre un eje global, y por defecto éste será el eje Y. Ello implicará que nuestro transform, si no le indicamos lo contrario, girará hacia la derecha y la izquierda "mirando" al transform que hayamos designado como objetivo.

Huelga decir que esta función se usa mucho para cámaras, cuando pretendemos que éstas sigan en todo momento a un determinado personaje.

Es importante avisar de que para que el transform gire sobre el eje que le indiquemos, ha de estar totalmente perpendicular a dicho eje global.

Vamos a la práctica. En el Proyecto, colocamos el ratón sobre la carpeta Mis Scripts y le damos al botón derecho=>create=>javascript. Al nuevo script lo renombramos como MiSegundoScript y le damos doble click para se se nos abra el editor.

Desplazamos un poco hacia abajo la función Update, y la dejamos como sigue:


var sigueme : Transform;

function Update () {
transform.LookAt(sigueme);
}


Salvamos, y la arrastramos hasta nuestra cámara en la jerarquía. Seleccionamos entonces la cámara y arrastramos ahora hasta la variable sigueme nuestro cubo.

Previamente a darle al play nos aseguramos de que el otro script (MiPrimerScript) que tenemos vinculado al cubo, contenga lo siguiente:


var centroDeGravedad: Transform;

function Update() {
transform.RotateAround (centroDeGravedad.position, Vector3.up, 20 * Time.deltaTime);
}


Y ahora sí, ya podemos darle al play y perseguir a nuestro cubo.

function LookAt (worldPosition : Vector3, worldUp : Vector3 = Vector3.up) : void

Este segundo prototipo se diferencia del primero en que el objetivo que ha de seguir nuestro transform no es otro transform, sino un Vector3. Esto tiene sentido, siguiendo con el ejemplo de la cámara, si quisiéramos que ésta enfocara un punto concreto de la escena (en coordenadas globales)

Por ejemplo, si queremos que una cámara enfoque al centro de la escena, le vinculamos este script:


transform.LookAt(Vector3.zero);


Otra posibilidad que nos permite esta función es que sea nuestro jugador, desde su teclado, quien se encargue de decidir dónde ha de enfocar la cámara. Para ello tendremos que recurrir a una clase que aún no hemos visto, la clase input.

Abrimos el script MiSegundoScript, y tecleamos lo que sigue:


function Update () {
transform.LookAt(Vector3(Input.GetAxis("Horizontal") * 10.0,0,0));
}


Le damos al play y movemos la cámara con las flechas de desplazamiento horizontal. Quizás notemos que el resultado es un poco basto, pero meramente quería que tuviérais una idea de las utilidades de esta función. También podríamos controlar la cámara desde el ratón y no desde el teclado. Veremos todo esto en profundidad cuando estudiemos la clase input.

Nos vemos en el siguiente capítulo.

POSTED BY UnityScripts
POSTED IN
DISCUSSION 2 Comments

2 Responses to : 14. CLASE TRANSFORM (V)

  1. Unknown says:

    No entendí nada de como tengo que poner los códigos en el Script.. O sea para que el gameobject (que en mi caso es un búho) siga a mi personaje sobre si eje, o sea que rote. Cuál tengo que poner?? por que uso este
    "var sigueme : Transform;

    function Update () {
    transform.LookAt(sigueme);
    }"

    Y mi búho mira hacía el cielo y rota hacía mi personaje, o sea yo quiero que esté quieto y este rote nomas, observando a mi personaje. Qué debo hacer para que sea de esa forma??

  2. Anónimo says:

    Muy bien explicado, aunque aún así hay cosas que no entiendo. he probado todos los comandos para que un personaje gire sobre su eje Y hacia otro y ninguno me sirve porque todos hacen lo mismo, rotar de mas de un eje para mirar hacia el otro.

    La unica forma en la que lo he conseguido es con transform.eulerAngles.y porque he creado variables donde he guardado el angulo y de cada objeto y restando uno a otro el objeto gira hacia el otro, pero no por el angulo mas corto como hace por ejemplo quaternion.lookrotation.

    Necesito poder limitar los ejes de rotacion a solo el eje Y, pero no encuentro la formula para aplicarla a alguno de estos comandos y que solo me rote de ese eje.

    Saludos.

Leave a Reply

Con la tecnología de Blogger.