35. CLASE JOINT (y II)









breakForce:

var breakForce : float


La fuerza que es necesario aplicarle a este joint para romperlo. La fuerza podría venir por colisiones con otros objetos, fuerzas aplicadas con rigidbody.AddForce o por otros joints.

Vamos a realizar una serie de ejemplos que incluirán tanto las variables vistas en la lección anterior como en ésta. Para ello vamos a seguir los siguientes pasos:

1.- Eliminamos en el inspector el hingejoint de la esfera, y a ésta le añadimos un
sphere collider. La ubicamos en la posición (-1,0,-5). Le eliminamos el script que
tenía vinculado.
2.-Vamos al menú gameobject=>Create other=>Cube. Ubicamos este cube en (-1,0,0) y
le añadimos un hingejoint.
3.-Editamos el script MiPrimerScript como sigue:

var pegadoATi : Rigidbody;
hingeJoint.connectedBody = pegadoATi;

hingeJoint.breakForce = 20;

4.-Asignamos MiPrimerScript al recién creado gameobject Cube, y luego arrastramos
nuestro cubo a la variable pegadoATi.
5.-Editamos ahora MiSegundo script, tecleando:

function FixedUpdate() {
rigidbody.AddForce(0,0,9);
}

6.-Este script se lo asignamos a la esfera.

Bueno, pues vamos ahora a jugar a los bolos más rupestres de la historia. Tenemos por un lado dos cubos unidos por un joint (el cubo que tiene el hinge joint y el cubo unido a éste primero a través de la variable connectedBody), con una fuerza de ruptura de 20, y una esfera dispuesta a chocar contra el cubo situado a nuestra izquierda con una fuerza de 9. Démosle al play y probemos qué sucede.

Está claro que es mayor la resistencia del cubo que la fuerza de la esfera. Veamos si la variable breakForce ha tenido algo que ver en dicha resistencia cambiando su valor de 20 a 4. Play.

Observamos que -aunque con algo de esfuerzo- ahora sí la esfera rompe el joint y consigue arrastrar el cubo de la izquierda (el portador del hingejoint).

Hagamos ahora unas pequeñas modificaciones: Ubicamos la esfera en (0,0,-5) para que nos vaya a impactar al cubo que no tiene asignado el hingejoint.

Para hacer un acercamiento intuitivo al ejercicio, podemos pensar que el cubo situado a nuestra izquierda (cube) sería el marco y el de nuestra derecha (nuestro cubo) la puerta. Visto así, ahora vamos a intentar impactar nuestra esfera con la puerta.

Restablecemos la variable breakForce a 20. Le damos al play. Veremos que la esfera arrastra al cubo (abre la puerta), pero no rompe su unión con el otro cubo. Cambiemos de nuevo la variable breakForce de valor, pongámmosle un 1. De nuevo play. Observad cómo la esfera no tiene problemas en romper la juntura.

Pero vamos a seguir jugando con las variables que hemos ido viendo en estos dos capítulos. Antes que nada desplazaremos un poco nuestra esfera para que sólo golpee en el cubo que no tiene el hinge joint, así que ubicamos la esfera en (0.5,0,-5)

Vamos a añadir luego la variable axis a MiPrimerScript, de la siguiente manera:


var pegadoATi : Rigidbody;

hingeJoint.connectedBody = pegadoATi;
hingeJoint.axis = Vector3.up;
hingeJoint.breakForce = 20;


Recordemos que axis indica el eje alrededor del cual el movimiento de nuestro rigidbody portador del hingejoint permanecerá bloqueado. Por lo tanto, si bloqueamos el eje up/down a través de la variable axis, teóricamente el cubo de nuestra izquierda no debería girar sobre dicho eje. Como truco os recomendaría que antes de darle al play seleccionárais en el inspector el Cube, para que veáis la flecha naranja saliendo del gameobject. Al darle al play, la flecha señalará en la dirección del eje indicado por la variable axis.

Pulsamos el play, decimos, y tal como esperábamos, la esfera pasa a través del cubo de nuestra derecha, pero el que tiene el hinge joint no gira sobre su eje vertical. La diferencia resulta muy clara si cambiamos en lugar de Vector3.up colocamos Vector3.forward como valor de axis. probadlo sin miedo.

Probemos ahora la variable anchor, que tal como indicábamos indica la posición del ancla alrededor de la cual se restringe el movimiento de los joints. Probemos a dejar MiPrimerScript así:


var pegadoATi : Rigidbody;

hingeJoint.connectedBody = pegadoATi;
hingeJoint.axis = Vector3.right;
hingeJoint.anchor = Vector3(0,0,0);
hingeJoint.breakForce = 20;


Hemos cambiado, como vemos, el eje que restringirá la variable axis, pasando del eje arriba/abajo al derecha/izquierda. Ubicamos la variable anchor en las coordenadas locales de nuestro hingejoint (0,0,0). Démosle al play y observemos por un lado la ubicación de la flecha naranja (recordemos previo pulsar play dejar seleccionado Cube) y por otro el comportamiento de ambos cubos al ser impactados por la esfera.

Vale. Ahora vamos a modificar la ubicación del ancla. Dejémosla así:


hingeJoint.anchor = Vector3(0,-0.5,0.5);


Eso significa (recordemos que estamos en coordenadas locales del cube) que el ancla estará situada en el centro del cube respecto del eje X (0), en la parte inferior del cube respecto del eje Y (-0.5) y en la parte trasera del cube respecto al eje Z (0.5). Démosle al play y observemos la situación del ancla y la diferencia de comportamiento.




breakTorque:

var breakTorque : float


La torsión que es necesario aplicar a este joint para romperlo.


FUNCIONES:

OnJointBreak:

function OnJointBreak (breakForce : float) : void


Función de tipo "mensaje enviado" que es llamada cuando un joint vinculado al mismo game object se rompe. Cuando una fuerza que es mayor que el breakForce del joint es aplicada, el joint se romperá. En ese momento, esta función será llamada y el la fuerza de ruptura aplicada al joint le será pasada a la misma. Después de OnJointBreak el joint automáticamente será borrado del game object.

Adaptemos MiPrimerScript para explicar esta función:


var pegadoATi : Rigidbody;

hingeJoint.connectedBody = pegadoATi;
hingeJoint.breakForce = 1.0;

function OnJointBreak(resistencia : float) {
Debug.Log("Se nos rompió el joint con resistencia " + resistencia);
}


El script es bastante sencillo. Le aplicamos a nuestro hingejoint una fuerza de ruptura baja, para asegurarnos de que el impacto de la esfera lo romperá. Cuando esto suceda será llamada la función OnJointBreak, que en este caso imprimirá un mensaje en el que, además de un texto, mostrará el valor que tendrá tras la ruptura la variable que le pasamos como parámetro, y que coincidirá con la fuerza de ruptura previamente asignada.

Bueno, pues explicada la clase base, iremos a por las diferentes clases que heredan de joint.

POSTED BY UnityScripts
POSTED IN
DISCUSSION 0 Comments

Leave a Reply

Con la tecnología de Blogger.