4 SIL assignment methodology
4.9 Harm frequency summation – Step 7
Para la función de objeto protagonista se ha elegido una esfera texturada configurada como sólido rígido ya que, si se considera sólo el control del movimiento absoluto (dejando a un lado animaciones y efectos), es el caso más complejo, dado que se basa en el rozamiento entre las superficies de la esfera y del objeto sobre el que está apoyada. Es importante comprender bien este punto, ya que es la base de todo lo que concierne al movimiento de la pelota, por tanto se va a explicar con más detalle:
La clave está en que la pelota, para que el movimiento parezca natural, tiene que rodar sobre la superficie, es decir, el punto de apoyo debe cambiar adecuadamente en cada instante (si el punto de apoyo es siempre el mismo se está produciendo un arrastre).
Por una parte es necesario aplicar una textura tanto a la superficie de la pelota como a la del objeto sobre el que apoya (en caso de que no haya otras referencias visuales). Se puede pensar en una bola de billar: si su superficie no tuviera dibujo y fuera perfecta, no sería posible determinar si se está moviendo por si misma o arrastrada por un hilo transparente; si, aunque estuviera texturada, el tapete fuese perfectamente plano y no hubiera elementos de referencia (objetos fijos como los bordes u otras bolas) tampoco podría saberse si se está moviéndose correctamente o no (podría estar elevada y por tanto girando sin ocasionar movimiento absoluto, o apoyada sobre una superficie de rozamiento cero).
Por otra parte, el movimiento se debe implementar aplicando fuerzas, tanto las que afectan a la pelota en sí como las de rozamiento. El coeficiente de rozamiento se establece mediante el valor “Friction” de los materiales, situado en la sección “Physics” de la pestaña “Material”. Lógicamente hay que tener en cuenta cada uno de los materiales que intervienen y ajustar su coeficiente de rozamiento individualmente para conseguir el comportamiento deseado. Las fuerzas que se aplican a la pelota son principalmente de dos tipos (“torque” y “force”), que se ilustran en la Figura 4 y se explican a continuación:
- “Force”: equivale a aplicar un empuje en una determinada dirección. Un ejemplo, acorde con la Figura 4, sería hacer rodar un neumático, en este caso empujando en la dirección negativa del eje X. De esta manera, el empuje aplicado es la causa del movimiento absoluto, y el rozamiento contra el suelo del movimiento respecto a sí misma (el giro); si el neumático se colocase sobre hielo, sería fácil moverlo sin que girase. En Python se implementa mediante nombre_objeto.applyForce(vector, local), indicando mediante el parámetro “vector” la dirección y magnitud del empuje y mediante “local” los ejes que se deben tomar como referencia (los locales del objeto o los globales). Se puede decir que esta fuerza se aplica al centro de masas del objeto sin producir “torque”.
- “Torque”: aplica un movimiento de torsión alrededor de un determinado eje. En el mundo real se da, por ejemplo, en las ruedas motrices de los coches. En este caso el movimiento generado es el local, el giro, y el rozamiento con otra superficie produce el desplazamiento absoluto. Si se coloca un coche sobre hielo y se acelera, las ruedas motrices girarán sin que el coche se mueva apenas. Se implementa mediante
nombre_objeto.applyTorque(vector, local), donde el parámetro “vector” representa el eje sobre el que se realiza el giro y el parámetro “local” los ejes tomados como referencia. Dado un eje, el giro se aplica en el sentido de las agujas del reloj respecto al vector pasado. Para conseguir el movimiento representado en la Figura 4 habría que pasar el vector (0,n,0), determinando mediante “n” la fuerza con que se aplica el giro. Para mover la rueda en sentido contrario habría que cambiar el signo de “n”. Se puede decir que se aplica un par de fuerzas equilibrado que sólo produce “torque”.
Control del objeto protagonista
Figura 4. Esquema ilustrativo del efecto de los métodos “force” y “torque”
En el Fragmento de código 7 se presentan dos funciones y sendas llamadas a las mismas cuyo efecto sobre la rueda de la Figura 4 sería equivalente desde el punto de vista cualitativo (siempre que el rozamiento entre la rueda y el suelo sea adecuado, pues además influirían la masa y el momento de inercia de la rueda). Es conveniente usar vectores normalizados y multiplicarlos por una constante para posteriormente poder modificar la magnitud del efecto con facilidad.
from bge import logic
escena = logic.getCurrentScene()
rueda = escena.objects['rueda']
VELOCIDAD = 5
def avanzar_torque(magnitud):
rueda.applyTorque(magnitud*[0,1,0],0)
def avanzar_force(magnitud):
rueda.applyForce(magnitud*[-1,0,0],0)
>>> avanzar_torque(VELOCIDAD)
>>> avanzar_force(VELOCIDAD)
Fragmento de código 7. Ejemplo de uso de las funciones “applyTorque” y “applyForce”
Para demostrar el funcionamiento y la diferencia ambos métodos se ha diseñado una pequeña aplicación interactiva (fichero “demo_force_torque.blend”); mediante las teclas “t” y “f” se aplica “torque” o “force” respectivamente, mediante “x”, “y”, “z” o los números se determina el eje de actuación, y con “g” o “l” el uso de coordenadas globales o locales.
En este proyecto se ha decidido generar el movimiento más básico, el que hace moverse a la pelota sobre el suelo, aplicando “torque”. La razón para ello es que el movimiento absoluto generado depende del rozamiento entre las superficies, lo que permite distinguir entre varios
tipos de terreno (al cambiar el coeficiente de rozamiento cambia el agarre), simular “derrapes” y, lo que es más importante, hace que la pelota no se desplace (no reciba impulso adicional) al estar en el aire, eliminando la necesidad de programar lógica adicional para tenerlo en cuenta.
No obstante, se ha implementado también mediante “force”, para dar la posibilidad de controlar la pelota mientras está en el aire. Las constantes que controlan el efecto de ambos métodos son distintas, para poder configurarlos independientemente y conseguir el resultado deseado. Hay que tener en cuenta que el motor físico de Blender, llamado “Bullet”, permite controlar la masa del objeto y un factor de forma para escalar el tensor de inercia. Aparentemente, el sistema calcula o estima el tensor de inercia.