基于osg的python三维程序开发(五)------沿路径运动

在上一节中, 我们演示了如何更新节点的状态, 这是动画的基本的技巧。 这一小节里,我们看一个稍微复杂一点的例子------让物体沿着固定的路径运动。

在osg 中,使得物体沿着固定路径运动, 会用到几个重要的类;

1. osg::AnimationPath

2. osg::AnimationPathCallback

这两个类一般是联合使用。 其中osg::AnimationPath定义了路径,通常路径由许多控制点组成。 AnimationPathCallback是一个NodeCallback的子类,用来更新模型的位置。

下面的代码从osg c++ 版本的osganimation的例子改写而来。

我们先来定义一条路径

 1 def createAnimationPath(center,radius,looptime):
 2     # set up the animation path
 3     animationPath = osg.AnimationPath()
 4     animationPath.setLoopMode(osg.LOOP)
 5     numSamples = 40
 6     yaw = 0.0
 7     yaw_delta = 2.0*osg.PI/(numSamples-1.0)
 8     roll = osg.inDegrees(30.0)
 9     time=0.0
10     time_delta = looptime/(numSamples)
11     for i in range(numSamples):
12         #position = center+[math.sin(yaw)*radius,math.cos(yaw)*radius,0.0]
13         delta = [math.sin(yaw)*radius,math.cos(yaw)*radius,0.0]
14         position = [x+y for x , y in zip(center, delta)]
15         q1 = osg.Quat(angle=roll, axis=[0.0,1.0,0.0])
16         q2 = osg.Quat(angle = -(yaw+osg.inDegrees(90.0)), axis=(0.0,0.0,1.0))
17         rotation = q1.multiply(q2)
18         animationPath.insert(time,osg.ControlPoint(position = position,rotation = rotation))
19         yaw = yaw + yaw_delta
20         time = time + time_delta
21     return animationPath

四元数是一种非常重要的描述物体位姿的数据,相关的知识可以参考透视几何方面的书籍。上面的代码仅演示如何用python来定义一条路径。完整的代码可以参考开源网址

https://github.com/enigma1997/pyosg 项目的例子。下面是最终的结果。

基于osg的python三维程序开发(五)------沿路径运动

上一篇:osgEarth的Rex引擎原理分析(七十一)


下一篇:CISSP考试心得分享