Blender: Promenez-vous dans la sphère

Afin de comprendre les scripts de jeux de pythons, je tente actuellement de construire une scène dans laquelle on peut contourner une sphère, en utilisant la structure FPSController de ce lien . Pour l’orientation gravitationnelle et FPSController, j’ai essayé de construire un contrôleur python qui ressemble actuellement à ceci:

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_masortingx() except Exception as E: print(E) rot = (0,0,0) rotZ = me.orientation me.orientation = rot*rotZ controller.activate(grav) main() 

qui fonctionne grosso modo jusqu’à ce qu’un angle dépasse 180 degrés et semble alors discontinu. Je suppose que cela vient de la discontinuité de rotation_différence – la documentation de Blender sur Math Types & Utilities ne dit rien, et je n’ai pas encore suffisamment réfléchi aux représentations quaternioniques pour voir si une carte continue serait possible – et je suppose pour que l’orientation Z locale dépend continuellement de la souris, alors que les orientations X et Y locales dépendent en permanence d’un vecteur donné, mais comment?

Le consensus semble être que vous devez accomplir de telles rotations en utilisant des quaternions.

Voir ceci pour l’API: http://www.blender.org/documentation/249PythonDoc/Mathutils.Quaternion-class.html

Voir ceci pour une introduction aux maths: http://en.wikipedia.org/wiki/Rotation_formalisms_in_three_dimensions#Quaternions

Il y a une fonction Allign. Si l’object-jeu est appelé propre, il devrait être quelque chose comme own.alignAxisToVect(vector, 2, 1) avec 2 comme index pour l’axe Z (x = 0, y = 1, z = 2) et 1 étant le vitesse d’allocation (entre 0 et 1)