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

34. CLASE JOINT (I)





Es la clase base para todos los tipos de joints. Por clase base queremos decir que no podemos instanciarla como tal, sino que sirve para ser heredada por diferentes tipos de joint (hingejoint, springjoint, characterjoint) que estudiaremos a continuación.

Podríamos traducir joint por juntura o articulación, pero en principio usaremos la palabra en inglés. No obstante, tal como denota el significado en castellano de joint, podemos deducir que esta clase sirve para unir varios objetos de una manera u otra (pensemos en una puerta unida por una bisagra, en las articulaciones que mantienen unidos los huesos, o meramente en una pared de objetos-ladrillo.)


VARIABLES:

connectedBody:

var connectedBody : Rigidbody


Esta variable referencia a otro rigidbody con el que este nuestra variante de joint conecta. Si la variable es null, el joint conecta el objeto con el mundo, esto es, en lugar de estar vinculado a otro rigidbody, nuestro objeto quedará "clavado" en su lugar en la escena.



axis:

var axis : Vector3


El eje altededor del cual el movimiento del rigidbody estará restringido, indicado en coordenadas locales.


anchor:

var anchor : Vector3


La posición del ancla alrededor de la cual el movimiento de los joints está restringido. La posición es definida en espacio local.

En la próxima lección realizaremos una serie de ejemplos que nos permitirá comprender con mayor claridad la funcionalidad de estas variables.

POSTED BY UnityScripts
POSTED IN
DISCUSSION 0 Comments
Con la tecnología de Blogger.