2012-08-10 5 views
57

Um blender python spiel scripting zu verstehen, versuche ich derzeit, eine Szene zu bauen, in der man um eine Kugel gehen kann, mit der FPSController-Struktur von this link. Für die Schwerkraft und FPSController Orientierung habe ich versucht, ein Python-Controller zu konstruieren, die derzeit wie folgt aussieht:Blender: Walk around

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() 

die in etwa funktioniert, bis jeder Winkel über 180 Grad geht, und sieht dann diskontinuierlich. Ich nehme an, das kommt davon, dass rotation_difference diskontinuierlich ist - blender documentation on Math Types & Utilities sagt nichts, und ich habe nicht genug über quaternionische Darstellungen nachgedacht, um zu sehen, ob eine kontinuierliche Karte möglich wäre - und ich denke, es gibt einen eleganteren Weg, um das lokale Z zu erreichen Die Orientierung ist ständig mausabhängig, während die lokalen X- und Y-Orientierungen kontinuierlich von einem gegebenen Vektor abhängen, aber wie?

+15

Drehungen im 3D-Raum können ziemlich schwierig sein. Meiner Meinung nach ist es am einfachsten, die Zeit für das Verständnis von Quaternionen zu nutzen und diese stattdessen zu verwenden. – fluffels

+0

Bei der Verwendung von Euler-Winkeln (anstelle von Quaternionen) kann eines der Probleme sein, an denen Sie möglicherweise beteiligt sind: Gimbal Lock (http://en.wikipedia.org/wiki/Gimbal_lock), was zu einigen Problemen führen kann – decden

+0

Ist es einfach, dies zu versuchen wenn du Blender installiert hast? (Kein Blender-Experte) – Gerard

Antwort

0

Es gibt eine allign-Funktion. Wenn das Spielobjekt selbst heißt, sollte es etwa so aussehen: wobei 2 der Index für die Z-Achse ist (x = 0, y = 1, z = 2) und 1 die Geschwindigkeit der Ausrichtung ist (zwischen 0 und 1)