En la sección anterior, demostramos cómo actualizar el estado de los nodos, que es las habilidades básicas de la animación. En esta sección, nos fijamos en un ejemplo un poco más complicado ------ hacer que el objeto a lo largo de una trayectoria fija.
En osg de modo que un objeto que se mueve a lo largo de una trayectoria fija, será utilizado varias clases importantes;
1. osg :: AnimationPath
2. osg :: AnimationPathCallback
Estas dos clases se utilizan generalmente en combinación. En donde osg :: AnimationPath define el camino, el camino se compone generalmente de muchos puntos de control. AnimationPathCallback NodeCallback es una subclase del modelo se utiliza para actualizar la posición.
El ejemplo de código reescrito provienen de osg c ++ versión de osganimation.
Primero vamos a definir un camino
1 def createAnimationPath (centro, radio, LOOPTIME): 2 # configurar la ruta de animación 3 animationPath = osg.AnimationPath () 4 animationPath.setLoopMode (osg.LOOP) 5 numSamples = 40 6 guiñada = 0.0 7 yaw_delta = 2,0 * osg. PI / (numSamples-1.0 ) 8 rollo = osg.inDegrees (30,0 ) 9 tiempo = 0,0 10 TIME_DELTA = LOOPTIME / (numSamples) 11 para i en gama (numSamples): 12 #posición = Centro + [Math.sin (guiñada) * radio, math.cos (guiñada) * radio, 0,0] 13 delta = [math.sin (guiñada) * radio, math.cos (guiñada) * radio, 0,0 ] 14 posición = [x + y para x, y en zip (centro, delta)] 15 Q1 = osg.Quat (ángulo = roll, eje = [0.0,1.0,0.0 ]) 16 q2 = osg.Quat (ángulo = - (guiñada + osg.inDegrees (90,0)), eje = (0.0,0.0,1.0 )) 17 de rotación = q1.multiply (q2) 18 animationPath.insert (tiempo, osg.ControlPoint (posición = posición, rotación = rotación)) 19 de guiñada = guiñada + yaw_delta 20 tiempo = tiempo + TIME_DELTA 21 de retorno animationPath
Cuaternión es una descripción de datos muy importante de la pose objeto, el conocimiento relevante de referencia puede ser geométricamente vista en perspectiva del libro. El código anterior sólo muestra cómo definir un camino con un pitón. El código completo se puede consultar la página web de código abierto
Ejemplos https://github.com/enigma1997/pyosg proyecto. Aquí está el resultado final.