9. ESTRUCTURA VECTOR3 (y IV)










FUNCIONES DE CLASE:


Lerp:

static function Lerp (from : Vector3, to : Vector3, t : float) : Vector3


Esta función interpola linealmente entre dos vectores, desde from hacia to en el valor t.

Vamos a intentar explicarlo de la manera más clara posible, ya que se trata de una función importante: Lerp realiza una línea imaginaria que va del punto que le pasamos como primer parámetro (from) al punto que le pasamos como segundo parámetro (to). Esa línea imaginaria es entonces una recta con un origen y un final, y entre ambos extremos tiene muchos puntos intermedios. Pensemos por ejemplo en una regla, para tener más o menos claro el concepto. Pongamos que al punto de origen (from) le asignamos el valor 0, y al punto final (to) le damos el valor 1. En ese caso, el punto que está en la mitad de nuestra recta imaginaria es evidente que valdrá 0,5.

Con esto claro planteemos ahora el mismo asunto pero al revés. Tenemos el punto origen y el punto final y queremos saber dónde está la mitad exacta entre esos dos puntos. Lo que haríamos es llamar a la función Lerp, asignar a los parámetros primero y segundo respectivamente las coordenadas de origen y final y darle al tercer parámetro (que en el prototipo recibe el nombre de "t", y es de tipo float) el valor 0.5. El valor retornado por la función se corresponderá con el punto situado en el centro de los dos extremos dados.

El parámetro t puede recibir valores entre 0.0 (que coincide con el origen) hasta 1.0 (que coincide con el final).

Vamos a practicar.

En Unity, le quitamos provisionalmente a nuestro gameobject PortaScripts el script, para que no nos dé errores en lo que a continuación haremos.

Acto seguido vamos al menú gameobject=> creater other => capsule. Colocamos la cápsula a un valor -3 en el eje x del transform en el inspector. Renombramos a esta cápsula y la llamamos Origen.

Creamos luego otra cápsula, y en la coordenada x de su transform la pondremos en 3. La rebautizamos como Fin (Final es una palabra reservada)

Es preferible que tengamos la escena enfocada desde la vista superior (lo que conseguimos haciendo click en el eje Y del gizmo)

Ahora hacemos doble click en el script (que aunque hemos borrado del Portascripts sigue estando en el Proyecto), y tecleamos:


var principio : Transform;
var fin : Transform;

function Update () {
transform.position = Vector3.Lerp(principio.position, fin.position, 0.3);
}


Salvamos el script y lo arrastramos a nuestro cubo. Acto seguido seleccionamos el cubo y en el inspector nos aparecerán nuestras dos variables. Arrastramos origen a principio y destino a fin.

Si todo va bien, nuestro cubo debiera situarse a tres décimas partes de la línea hipotética que separa las cápsulas, contando desde la que hemos dado en llamar origen. ¿Lo probamos?



Bien. Parece que funciona, pero podemos ir un poco más allá. Para ello vamos a recurrir a una clase que aún no hemos estudiado, que es la clase Time, y concretamente a la variable time de la clase Time. Time.time es una variable que representa los segundos transcurridos desde que el juego se inicia. Por lo tanto, la variable vale cero al iniciarse el juego, 1 un segundo después, etc.

Con esto en mente, vamos a nuestro último script y dentro de la función Lerp sustituimos el 0.3 por Time.time, salvamos y le damos al play.

Efectivamente, nuestro cubo empieza pegado al origen (el parámetro t, representado por Time.time vale cero) y va desplazándose hacia el fin hasta que t vale 1, o sea, hasta que transcurre un segundo.

Sabiendo esto, podemos hacer que el trayecto de nuestro cubo dure por ejemplo diez segundos en lugar de uno. Conseguimos esto meramente multiplicando Time.time * 0.1.

Podemos, dándole una vuelta más de tuerca al asunto, crear una variable expuesta (susceptible de ser accesada desde el inspector) de tipo float, que el usuario pueda modificar, y que al ser multiplicada por Time.time haga que nuestro cubo viaje más rápido o más lento.


Slerp:

static function Slerp (from : Vector3, to : Vector3, t : float) : Vector3


Esta función es similar a la anterior, con la particularidad de que en lugar de interpolar en línea recta lo hace en forma esférica. Para probarla no tienes más que sustituir el término "Lerp" del script anterior por "Slerp", y poner el cubo en órbita. Si tienes tiempo y ganas, ubica los gameobjects Origen y Destino en otras posiciones a través de sus respectivos transforms en el inspector (desplázalos también en sus ejes Y y Z).

Mientras vas trasteando, me despido hasta la próxima clase.

POSTED BY UnityScripts
DISCUSSION 1 Comment

One Response to : 9. ESTRUCTURA VECTOR3 (y IV)

  1. En C# quedaría

    using UnityEngine;
    using System.Collections;

    public class ProbandoLerp : MonoBehaviour {

    public Transform inicio;
    public Transform fin;
    public float mult = 0.1f;
    bool marchaAtraz = false;

    void Start () {}

    void Update () {
    //transform.position = Vector3.Lerp (inicio.position, fin.position, 0.3f);
    transform.position = Vector3.Lerp (inicio.position, fin.position, Time.time * mult);
    //transform.position = Vector3.Slerp (inicio.position, fin.position, Time.time * mult);
    }
    }

Leave a Reply

Con la tecnología de Blogger.