2012-08-10 10 views
57

Para entender las secuencias de comandos del juego blender python, actualmente intento crear una escena en la que se pueda caminar alrededor de una esfera, usando la estructura FPSController desde this link. Para la gravedad y orientación FPSController I intentado construir un controlador de pitón, que actualmente se ve así:Blender: walk around sphere

def main(): 
    print("Started") 

    controller = bge.logic.getCurrentController() 
    me = controller.owner 

    distance, loc, glob = me.getVectTo((0,0,0)) 

    grav = controller.actuators['Gravity'] 

    strength = me['Gravity'] 
    force = strength*(distance*distance)*glob 

    grav.force = force 

    try: 
     rot = Vector((0,0,-1)).rotation_difference(glob).to_matrix() 
    except Exception as E: 
     print(E) 
     rot = (0,0,0) 

    rotZ = me.orientation 
    me.orientation = rot*rotZ 

    controller.activate(grav) 

main() 

que trabaja más o menos hasta cualquier ángulo Balón por encima de 180 grados, y se ve discontinua entonces. Supongo que esto viene de rotation_difference ser discontinuo - blender documentation on Math Types & Utilities no dice nada, y no he pensado lo suficiente acerca de representaciones cuaterniónicas aún para ver si un mapa continuo sería posible, y supongo que hay una manera más elegante de lograr que la Z local la orientación depende continuamente del ratón, mientras que las orientaciones X e Y locales dependen continuamente de un vector dado, pero ¿cómo?

+15

Las rotaciones en el espacio 3D pueden ser bastante difíciles. En mi opinión, es más fácil dedicar tiempo a entender los cuaterniones y usarlos en su lugar. – fluffels

+0

Si usa ángulos de Euler (en lugar de cuaterniones) uno de los problemas en los que puede incurrir es el bloqueo de cardán (http://en.wikipedia.org/wiki/Gimbal_lock), que puede causar algunos problemas – decden

+0

¿Es fácil probar esto? cuando tienes Blender instalado? (No es un experto en Blender) – Gerard

Respuesta

0

No es una función allign. Si el objeto de juego se llama propio, debería ser algo así como own.alignAxisToVect(vector, 2, 1) siendo 2 el índice para el eje Z (x = 0, y = 1, z = 2) y 1 es la velocidad de alineación (entre 0 y 1)

Cuestiones relacionadas