Moviendo un Vehículo

Guía para mover un vehículo en el Game Engine del Blender 

Volver a eahz.com 

 

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.

 

Este será impulsado por una sola rueda, que es la de atras, esto dara un ejecto de giro al empezar a andar ya que el vehiculo estará siendo empujado por una sola rueda, para evitar ese efecto se puede ponerle fuerza a las 2 llantas de atras o aumentando la masa al chasis y disminuyendo la fuerza de empuje del vehiculo. Un vehiculo con mas opciones podria ser que al oprimir una tecla el vehiculo tenga fuerza en las 4 ruedas dando la impresion de activar doble tracción, pero tengan en cuenta que esto hará que su carro tenga mucho empuje. 

 

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