2012-08-10 11 views
57

Per comprendere lo script di gioco di Python Blender, attualmente provo a creare una scena in cui si possa camminare intorno a una sfera, usando la struttura FPSController da this link. Per gravità e orientamento FPSController ho cercato di costruire un controllore pitone, che attualmente appare così: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() 

che funziona all'incirca fino a qualsiasi angolazione supera 180 gradi, e appare discontinua poi. Presumo che questo derivi da rotation_difference essendo discontinuo - blender documentation on Math Types & Utilities non dice nulla, e non ho ancora pensato abbastanza alle rappresentazioni quaternioniche per vedere se una mappa continua sarebbe possibile - e immagino ci sia un modo più elegante per ottenere che la Z locale l'orientamento è continuamente dipendente dal mouse, mentre gli orientamenti locali X e Y dipendono continuamente da un dato vettore, ma come?

+15

Le rotazioni nello spazio 3D possono essere abbastanza difficili. A mio parere, è più facile dedicare il tempo alla comprensione dei quaternioni e utilizzarli. – fluffels

+0

Se si utilizzano gli angoli di eulero (invece dei quaternioni) uno dei problemi a cui si può incorrere è il blocco del gimbal (http://en.wikipedia.org/wiki/Gimbal_lock), che potrebbe causare alcuni problemi – decden

+0

È facile provare questo quando hai installato Blender? (Non esperto di Blender) – Gerard

risposta

0

C'è un Allinea funzione. Se l'oggetto del gioco è chiamato proprio dovrebbe essere qualcosa come own.alignAxisToVect(vector, 2, 1) con 2 è l'indice per l'asse Z (x = 0, y = 1, z = 2) e 1 è la velocità di allineamento (tra 0 e 1)