78. CLASE PHYSICMATERIAL




Esta clase describe cómo manejar los objetos que chocan (fricción, capacidad de rebotar, etc). Es posible que recordemos cuando estudiábamos la clase Collider, que ésta tenía dos variables/atributos -material y sharedMaterial- de tipo PhysicMaterial. Por norma general para crear/modificar las capacidades de fricción y rebote de un gameobject, pues, lo haremos a través de la propiedad collider.material de dicho gameobject.

VARIABLES:

dynamicFriction:

var dynamicFriction : float


La fricción usada cuando ya hay movimiento. Este valor ha de estar entre 0 y 1, siendo 0 la fricción del hielo y 1 la del caucho.

Probemos un ejemplo. Para ello empecemos por eliminar el script vinculado a PortaScripts. Luego editamos miPrimerScript, de esta guisa:


collider.material.dynamicFriction = 0;

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


Salvamos y le asignamos el script al cubo. Como vemos, le hemos dado al material la mínima fricción. Le damos al play y observamos que la fuerza arrastra el cubo sin problemas. Pero ahora probad a darle a dynamicFriction un valor de 0.4.


staticFriction:

var staticFriction : float


La fricción usada cuando un objeto está reposando en una superficie. Usualmente un valor de 0 a 1.

Siguiendo con nuestro ejemplo, podemos teclear:


collider.material.staticFriction = 0;
collider.material.dynamicFriction = 0.2;
function FixedUpdate() {
rigidbody.AddForce(0,0,-9);
}


Aquí nuestro cubo tendría una fricción en reposo nula y una en movimiento baja. Podemos tratar de invertir las tornas entre ambos valores e ir experimentando.


bounciness:

var bounciness : float


Qué capacidad de rebote tiene la superficie. 0 es no rebote. Un valor de 1 implica rebote sin pérdida de energía.

Para verlo con un ejemplo, eliminamos el script vinculado a nuestro cubo, primero, y luego colocamos la esfera en la posición (2,5,0). Editamos entonces miPrimerScript:


collider.material.bounciness = 0.7;


Lo vinculamos a la esfera. Observamos que ésta rebota un poco, sobre todo si comparamos el comportamiento de la esfera si establecemos esta propiedad en cero. No obstante, nos puede sorprender que a un valor tan alto como 0.7 la capacidad de rebote de nuestra esfera no sea superior. Dicha sorpresa se acrecienta si le asignamos el valor máximo (1) a bounciness. Lo que sucede es que Unity establece una media entre los valores de rebote de las dos superficies en contacto. Probad a arrastrar miPrimerScript también al Suelo y veréis la diferencia.


frictionDirection2:

var frictionDirection2 : Vector3


Se refiere a la dirección de anisotropía. La fricción anisotrópica está habilitada salvo que su vector esté a cero.

La anisotropía es aquella cualidad (forma, tamaño, temperatura, etc) que cambia en un objeto cuando se mueve.

DynamicFriction2 y staticFriction2, que estudiaremos a continuación, serán aplicadas a lo lardo de frictionDirection2. La dirección de anisotropía es relativa al sistema de coordenadas local del collider.

Utilizaremos un pequeño ejemplo para entender cómo funciona esto. Previamente devolvemos a la esfera al suelo (position.y=0) y luego eliminamos el script miPrimerScript que tenemos vinculado al suelo y la esfera. Editamos después de nuevo miPrimerScript:


collider.material.dynamicFriction = 1;
collider.material.frictionDirection2 = Vector3.forward;
collider.material.dynamicFriction2 = 0;

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


Arrastramos tras salvar el script al cubo.

Bien. Vamos a tratar de explicar qué tenemos aquí. En primer lugar establecemos la fricción dinámica del cubo al máximo, esto es, 1. De esta manera debería resultar difícil poderlo arrastrar. Pero, a continuación, le damos a frictionDirection2 un valor distinto a 0,0,0, esto es, lo activamos. Lo que le estamos diciendo aqui a Unity es que a lo largo del eje Z (forward) la fricción del cubo será distinta que cuando se mueva a lo largo de los otros dos ejes (esto es la anisotropía). Concretamente, en la tercera declaración le indicamos a Unity que la fricción dinámica en ese eje Z dynamicFriction2 será nula (0).

En consecuencia, el resultado de este script debería hacer que el cubo se resistiera a moverse en los ejes X e Y pero en cambio no tuviera problemas en hacerlo en el eje Z. Para abrir boca, le aplicamos al script acto seguido una fuerza en el eje X. Pulsemos el play y comprobemos que el cubo si se mueve.

Pero ahora cambiemos los parámetros de AddForce a (5,0-5), esto es, aplicándole la misma fuerza en el eje Z (que no debería tener resistencia) que al X. Si funciona como debiera, el cubo empezará a moverse hacia delante, pero seguirá negándose a hacerlo hacia la derecha, aunque la presión en un eje y otro es la misma. Probad.


dynamicFriction2:

var dynamicFriction2 : float


Si la fricción anisotrópica está habilitada (frictionDirection2 no vale cero), dynamicFriction2 será aplicada a lo largo del eje/s de frictionDirection2 que no valga cero.


staticFriction2:

var staticFriction2 : float


Si la fricción anisotrópica está habilitada, staticFriction2 será aplicada a lo largo de frictionDirection2.


frictionCombine:

var frictionCombine : PhysicMaterialCombine


Determina cómo se combina la fricción. Tal como explicaba hace unas líneas en relación con el rebote, asimismo las propiedades de fricción son dependientes de la combinación de los dos materiales en contacto.

PhysicMaterialCombine (el tipo de este atributo) es una enumeración con las diferentes posibilidades de combinación de fricciones y capacidades de rebote.


Average: La media de la fricción o rebote de los materiales de los dos colliders.
Multiply: Multiplica la fricción o rebote de los materiales de los dos colliders.
Minimum: Usa el valor más bajo de fricción o rebote de los dos colliders.
Maximum: El valor más alto de los dos.


Así, la sintaxis para establecer la fricción entre dos colliders en el valor más alto de los dos sería así (a modo indicativo, nada más):

 
collider.material.frictionCombine = PhysicMaterialCombine.Maximum;



bounceCombine:

var bounceCombine : PhysicMaterialCombine


Determina cómo la capacidad de rebote es combinada. Al igual que la anterior, recurriremos al enum PysicMaterialCombine.


FUNCIONES:

PhysicMaterial:

static function PhysicMaterial () : PhysicMaterial


La función constructora crea un nuevo material. Es normalmente más fácil, sin embargo, usar meramente un collider.material y modificar el material vinculado directamente.


static function PhysicMaterial (name : String) : PhysicMaterial

Crea un nuevo material con un nombre dado.

POSTED BY UnityScripts
DISCUSSION 0 Comments

Leave a Reply

Con la tecnología de Blogger.