Moviendo un Vehículo en Blender
Por: Eduardo A Hernández Z.
Hace algún tiempo algunos
desarrolladores del bullet implementaron una serie de funciones en el modulo
del GameEngine que aplicados a unos determinados objetos, permiten obtener uno
movimientos de vehículo bastante realistas. Esta guía dará a conocer una serie
de pasos necesarios para poder aplicar estas funciones en sus juegos y obtener
un buen vehículo de forma rápida.
El Chasis
El primer paso es el modelado del chasis, la parte del modelado no se toca en este manual ya que es una aspecto extenso.
Sin embargo una vez creado este
objeto, se deben tener en cuenta las siguientes recomendaciones:
Es muy importante que las normales
estén apuntando hacia afuera, esto se hace en modo edición, selecciona todos
los vértices y luego oprime (ctrl + n).
Los ejes del chasis deben concordar
con los de espacio, para ello hay que aplicar clear rotation (Alt + r) y luego
aplicar escala y rotación con (Ctrl + a).
Al chasis en el menú Logic (F4) hay
que aplicarle lo siguiente:
- Actor
- Dinamics
- RigidBody
- No sleepin
- Mass = 210 (recomendo, puede ser cambiada)
- Radius = 1
- Damp = 0.2
- Rotdamp = 0.4
- Bounds (activado) tipo cylinder (Recomendado)
También se le deben definir las
siguientes propierties:
- Init tipo:
int valor = 0
- cid tipo:
int valor = 0
- guia tipo:
float valor = 0.0
- fuerza tipo:
float valor = 0.0
- friccion tipo:
float valor = 0.0
Los sensores aplicados se detallan
mas adelante ya que deben ir unidos a los de los neumáticos.
Los Neumáticos
Para los neumáticos se deben modelar como mínimo 3 ruedas, para ello se debe modelar un cilindro puede ser de 15 caras o mas para no tener muchos polígonos, y hay que seguir las recomendaciones hechas con el chasis, sobre las normales y la rotación. Además de esto es muy importante aclarar que estas NUNCA deben ser emparentadas al chasis ya que el script se encarga de colocarlas en unas determinadas coordenadas.
En la anterior imagen es muy
importante darse cuenta de donde están puestas las ruedas, estas no deben
colocarse en la posición natural de un neumático, se recomienda colocarse
debajo del plano que servirá de suelo en el juego, ya que por alguna razón a
veces suele dar resultados no deseados.
A cada neumático se le debe activar
en el Logic (F4) lo siguiente:
- Actor
- Ghost
Los Logic bricks del vehículo
Los logic bricks del chasis y de
los neumáticos se encuentran relacionados en la siguiente tabla:
(Hacer click encima de la imagen para ver mas grande).
Como se ve en el cuadro los sensores y
actuators de los neumáticos se deben conectar como entradas y salidas del
primer controller del chasis marcado con (#1), la flecha curva es para los no
se den cuenta, y si alguien se pregunta porque no se puso 4 flechas es porque
quedaba mucha montonera : ) .
Todos los sensor del chasis excepto el
de la tecla escape deben tener activado el level triggerring:
Ahí esta el leven triggering en la
imagen para los que no lo conocen, sirve para indicar que se debe ejecutar una
acción mientras la tecla este oprimida. Los 4 últimos sensores del chasis tipo
property se encargan de regresar a los neumaticos a su alineación normal, o sea
hacia el frente e impiden que la dirección gire más de 170 grados
aproximadamente a lado y lado.
Es muy importante colocar el nombre
que se indica en la tabla para cada uno de los actores de los neumáticos
llamados (llanta0, llanta1, llanta2 y llanta3) sino no funciona y además en el
script asi han sido llamadas.
El script
Aquí esta el código del script por si
acaso no se lo encuentra en la descarga, el script como se dijo anteriormente
se encarga de emparentar los neumáticos con el chasis, e internamente les
asigna un numero, si el vehículo es de 4 ruedas serán numeradas (0,1,2,3), y
uno debe indicar cuales servirán de dirección y cual tendrá la fuerza de
empuje. Si se desea colocar las llantas mas hacia afuera, adentro, atras y
adelante del vehículo se deben modificar los valores ingresados a la variable llantapos que es un vector con 3
valores (llantapos = [(afuera o adentro),(adelante o atras),
v1]), v1 todavía no se para que sirve pero si alguien lo descubre por favor
avisar.
import PhysicsConstraints
import GameLogic
cont = GameLogic.getCurrentController()
own =
cont.getOwner()
own.applyImpulse([0.,0.,0.],[0.,0.,0.])
if (own.init == 0):
own.init = 1
physicsid =
own.getPhysicsId()
vehicle =
PhysicsConstraints.createConstraint(physicsid,0,11)
own.cid =
vehicle.getConstraintId()
vehicle =
PhysicsConstraints.getVehicleConstraint(own.cid)
v1= 0.
llantadir =
[0,0,-1]
llantaAx =
[-1,0,0]
suspension = 0.9
llanta_radio =
0.5
direccion= 1
act0 =
cont.getActuator("llanta0")
llantapos = [1.4
,1.9, v1]
llanta0 =
act0.getOwner()
vehicle.addWheel(llanta0,llantapos,llantadir,llantaAx,suspension,llanta_radio,direccion)
act2 =
cont.getActuator("llanta1")
llantapos =
[-1.4 ,1.9, v1]
llanta2 =
act2.getOwner()
vehicle.addWheel(llanta2,llantapos,llantadir,llantaAx,suspension,llanta_radio,direccion)
direccion = 0
act1 =
cont.getActuator("llanta2")
llantapos = [1.4
,-1.7, v1]
llanta1 =
act1.getOwner()
vehicle.addWheel(llanta1,llantapos,llantadir,llantaAx,suspension,llanta_radio,direccion)
act3 = cont.getActuator("llanta3")
llantapos =
[-1.4 ,-1.7, v1]
llanta3 =
act3.getOwner()
vehicle.addWheel(llanta3,llantapos,llantadir,llantaAx,suspension,llanta_radio,direccion)
else:
vehicle =
PhysicsConstraints.getVehicleConstraint(own.cid)
#aqui se indica que la llanta 0 servirá de direccion
vehicle.setSteeringValue(own.guia,0)
#aqui se indica la otra llanta que servirá de dirección
vehicle.setSteeringValue(own.guia,1)
#aqui se indica que llanta tendra la fuerza, se recomienda
solo una o 2
vehicle.applyEngineForce(own.fuerza,2)
#vehicle.applyEngineForce(own.fuerza,3) para impulso en la otra llanta de atras.
influencia =
0.01
vehicle.setRollInfluence(influencia,0)
vehicle.setRollInfluence(influencia,1)
vehicle.setRollInfluence(influencia,2)
vehicle.setRollInfluence(influencia,3)
rigidez = 100.0
vehicle.setSuspensionStiffness(rigidez,0)
vehicle.setSuspensionStiffness(rigidez,1)
vehicle.setSuspensionStiffness(rigidez,2)
vehicle.setSuspensionStiffness(rigidez,3)
humedad = 2.0
vehicle.setSuspensionDamping(humedad,0)
vehicle.setSuspensionDamping(humedad,1)
vehicle.setSuspensionDamping(humedad,2)
vehicle.setSuspensionDamping(humedad,3)
compresion = 6
vehicle.setSuspensionCompression(compresion,0)
vehicle.setSuspensionCompression(compresion,1)
vehicle.setSuspensionCompression(compresion,2)
vehicle.setSuspensionCompression(compresion,3)
friccion =
own.friccion
vehicle.setTyreFriction(friccion,0)
vehicle.setTyreFriction(friccion,1)
vehicle.setTyreFriction(friccion,2)
vehicle.setTyreFriction(friccion,3)
Descargar pdf: Descarga
Blend de ejemplo: Descarga
Script en Python (template): Descarga



