20. CLASE RIGIDBODY (IV)









isKinematic:

Var isKinematic : boolean


Es un booleano que controla si las físicas afectan al rigidbody. Si isKinematic está habilitado (es true), a nuestro rigidbody no le afectarán ni fuerzas, ni colisiones ni junturas (joints). Ello quiere decir que no podemos esperar que frente -por ejemplo- a una colisión ese rigidbody kinemático se comporte de la manera lógica que por su masa, resistencia y gravedad debiera comportarse. Sus movimientos, reacciones y respuestas, por tanto, deberemos marcárselos específicamente mediante scripts o animaciones.

Los cuerpos kinemáticos, por el contrario y a su vez, sí afectan el movimiento de otros rigidbodies no kinemáticos a través de colisiones o joints.

Quisiera aprovechar para recordar que las variables "expuestas" de tipo booleano son mostradas por el inspector como un checkbox, donde el cuadro marcado se corresponde a true y el desmarcado al false.


freezeRotation:

Var freezeRotation : Boolean


Esta variable vendría a ser una especialización de la anterior. freezeRotation controla si las físicas cambiarán la rotación del objeto. Si esta variable está habilitada (true), la rotación no será mofificada por la simulación de físicas, y en todo caso tendremos que establecerla nosotros manualmente mediante scripts o animaciones.



constraints:

Var constraints : RigidbodyConstraints


Controla qué grados de libertad están permitidos para la simulación de nuestro rigidbody. Por defecto esta variable tiene el valor RigidbodyConstraints.FreezeNone, permitiendo rotación y movimiento en todos los ejes.

En algunos casos, puedes querer constreñir un rigidbody para que sólo se mueva o rote sobre algunos ejes, como por ejemplo cuando desarrolles juegos en 2D. Puedes usar el operador de bits OR ('||') para combinar múltiples constraints.

Vamos a probar con un sencillo ejemplo la utilidad de esta variable. En Unity alejamos un poco la cámara para que se vea tanto la esfera como el lateral izquierdo (según se mira) del plano. Abrimos nuestro script habitual:


function FixedUpdate () {
if (Input.GetButtonDown ("Horizontal")) {
rigidbody.velocity = Vector3(-6,0,0);
}
}


Salvamos, play, flecha desplazamiento lateral. La esfera sobrepasa la superficie del plano y arrastrada por la gravedad cae.

Podríamos solucionar esta eventualidad quitándole la gravedad a la esfera, pero tenemos una solución más elegante: no permitir que nuestra esfera se mueva en el eje Y (arriba/abajo).

Así que modificamos nuestro script:


function FixedUpdate () {
if (Input.GetButtonDown ("Horizontal")) {
rigidbody.velocity = Vector3(-6,0,0);
rigidbody.constraints = RigidbodyConstraints.FreezePositionY;
}
}


Y volvemos a probar. Dado que le hemos congelado ("freeze") a nuestra esfera la posibilidad de alterar el valor de su eje de posición Y, la esfera no puede ni ascender ni caer, razón por la cual continúa rodando allende el plano.

Observamos que esta variable es de tipo RigidbodyConstraints, lo cual en el fondo es una enumeración que nos permite elegir entre una serie de valores, a saber:


None Sin limitaciones de posición ni de rotación
FreezePositionX Congela la posición en el eje X.
FreezePositionY Congela la posición en el eje Y.
FreezePositionZ Congela la posición en el eje Z.
FreezeRotationX Congela la rotación sobre el eje X.
FreezeRotationY Congela la rotación sobre el eje Y.
FreezeRotationZ Congela la rotación sobre el eje Z.
FreezePosition Congela la posición sobre todos los ejes.
FreezeRotation Congela la rotación sobre todos los ejes
FreezeAll Congela rotación y posición de todos los ejes



collisionDetectionMode:

var collisionDetectionMode : CollisionDetectionMode


Esta variable nos permite establecer el modo de detección de colisiones del rigidbody. Como podemos observar, es de tipo CollisionDetectionMode, tratándose ésta al igual que en el caso anterior de una enumeración que admite tres tipos de valores, que pasamos a desarrollar:


Distrete: Este es el modo de detección de colisiones por defecto. Es el que menos recursos consume, pero no garantiza que nuestro rigidbody detecte un conjunto de colisiones, sobre todo si estas acontencen a gran velocidad. En modo discrete Unity comprueba si el rigidbody ha sido colisionado cada vez que se llama a la función fixedUpdate, que como ya explicamos es llamada un número fijo de veces por segundo. Si la colisión se produce en el impass entre una llamada a fixedupdate y la siguiente, nuestro rigidbody no la captará.

Continuous: Con este modo on, nuestro rigidbody detectará las colisiones con cualquier malla geométrica estática que se tropiece en su camino, incluso si la colisión ocurre entre dos llamadas a FixedUpdate. Por malla geométrica estática Unity entiende cualquier MeshCollider (no tardaremos en estudiarlo) que no tenga un rigidbody vinculado.

ContinuousDinamic: Si establecemos este sistema de detección de colisiones para nuestro rigigbody, éste detectará colisiones tanto con mallas geométricas estáticas como con otros rigidbodies que tengan a su vez activado el modo continous collision detection. Este sistema consume bastantes recursos y debe ser sólo usado para prevenir movimientos muy rápidos de objetos. Sólo es soportado, además, por rigidbodies con sphere o box collider.


A efectos de sintaxis, para colocar el sistema de detección de un rigidbody en modo ContinuousDinamic, por ejemplo, lo escribiríamos así:


rigidbody.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic;

POSTED BY UnityScripts
POSTED IN
DISCUSSION 2 Comments

2 Responses to : 20. CLASE RIGIDBODY (IV)

  1. Jordi says:

    Sigo leyendo y aprendiendo :-)

    Comentarte que estan mal escritas Discrete y ContinuousDynamic. Si encuentro más errores quieres que te los comente o ya no actualizas el blog?

    Gracias de nuevo

  2. Unknown says:

    Creo que el tipo de colision no lo había visto yo nunca ni entendido y era el problema en un proyecto que estaba estudiando, con unity2d, en el cual muchas veces el personaje penetraba a gran velocidad la malla de colision y se quedaba rebotando con las mallas mezcladas...

Leave a Reply

Con la tecnología de Blogger.