python - Licuadora: caminar alrededor de la esfera
blender coordinate-transformation (2)
Para entender las secuencias de comandos de los juegos de python de Blender, actualmente intento crear una escena en la que se pueda caminar alrededor de una esfera, utilizando la estructura FPSController desde este enlace . Para la orientación de gravedad y FPSController, intenté construir un controlador python, que actualmente tiene este aspecto:
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 funciona aproximadamente hasta que cualquier ángulo supera los 180 grados, y luego parece discontinuo. Supongo que esto se debe a que la diferencia de rotación es discontinua: la documentación de Blender sobre Math Types & Utilities no dice nada, y aún no he pensado lo suficiente en las representaciones cuaterniónicas para ver si un mapa continuo sería posible, y creo que hay una forma más elegante para lograr que la orientación Z local sea continuamente dependiente del mouse, mientras que las orientaciones X e Y locales dependen continuamente de algún vector dado, pero ¿cómo?
El consenso parece ser que debe realizar dichas rotaciones utilizando cuaterniones.
Vea esto para la api: http://www.blender.org/documentation/249PythonDoc/Mathutils.Quaternion-class.html
Vea esto para una introducción a las matemáticas: http://en.wikipedia.org/wiki/Rotation_formalisms_in_three_dimensions#Quaternions
Hay una función de alineación. Si el juego-objeto se llama propio, debería ser algo como own.alignAxisToVect(vector, 2, 1)
siendo 2 el índice para el eje Z (x = 0, y = 1, z = 2) y 1 como el Velocidad de alineación (entre 0 y 1).