现在的位置: 首页 > 综合 > 正文

基于Klimt嵌入式三维动画开发

2013年11月04日 ⁄ 综合 ⁄ 共 2354字 ⁄ 字号 评论关闭
下面以创建一个旋转的立方体动画为例子说明Klimt三维动画的开发过程。
Klimt三维图形程序开发的一般过程为:

A. 定义类和源文件
根据需要开发的三维动画,我们使用面向对象编程,定义相关类和源文件,我们首先创建,RenderCube.h文件,定义我们的类RenderCube,然后再创建RenderCube.cpp文件实现我们这个类。由于我们的Klimt是基于Qt/Embedded的,也就是我们这个程序也是Qt/Embedded的程序,而且要使用到Qt/Embedded的窗体类帮助我们显示三维图形,所以这个类要继承Qt/Embedded里面的窗口部件类QWidget。类中主要定义的产生场景的函数,这个函数绘制一帧动画的场景;还有ZSurface帧缓冲区;QTimer的对象,主要是获得心跳功能,使得动画可以连续产生;还有一些用于变换和其他用途的变量。
B. 构造ZSurface
RenderCube 类的实现中,我们首先要通过ZSurface类初始化一个Frame Buffer:帧缓冲区,是要来显示图像用的。由于开发板上的LCD显示屏的尺寸是240×320,所以定义的ZSurface大小为240×320
假设有声明ZSurface *backBuffer; 那么初始化时 语句为
backBuffer = new ZSurface(240,320);
C. 创建Context
Klimt的pipeline从程序的角度看就是一个状态机,有当前的颜色、纹理坐标、变换矩阵、绚染模式等一大堆状态,这些状态作用于程序提交的顶点坐标等图元从而形成帧缓冲内的像素。在Klimt的编程接口中,Context就代表这个状态机,程序的主要工作就是向Context提供图元、设置状态,偶尔也从Context里获取一些信息。
使用klCreateDefaultContext(); 来创建一个默认的Context
D. 设定帧缓冲区的大小和填充颜色缓冲区
设定帧缓冲区的大小,并且把帧缓冲区的缓冲内存填充到颜色缓冲区,使用:
klSetBufferSize(240, 320);
klSetColorBuffer(backBuffer->bits());
E. 初始化矩阵模式和投影矩阵
一般我们需要调用glMatrixMode函数初始化矩阵模式,一般设置两种模式:投影模式和模型视图模式,使用下面语句:
glMatrixMode(GL_PROJECTION);  //投影模式
glMatrixMode(GL_MODELVIEW);  //模型视图模式
glLoadIdentity();             //将当前矩阵设置为单位矩阵
如果要使用纹理,则要设置纹理矩阵:
glMatrixMode(GL_TEXTURE);
下面设置视图透视投影矩阵
gluPerspective(45.0f,(float)240/(float)320,0.1f,20.0f);
由于开发板的LCD是240×320的,所以以上使用240×320的投影矩阵。
F. 载入纹理资源
可以使用Qt/Embedded的QImage类从存储设备上载入用于纹理渲染的图片,由于Klimt中对纹理图像对数据是有一定要求的,必须是RGBA格式,而一般对图片不是这种格式,所以在载入图片后,需要对图片对数据进行转换,具体本人写了一个函数专门实现这种转换。然后使用一个unsigned类型的数据作为纹理的索引ID,使用glGenTextures初始化这个ID,然后用glBindTexture把纹理数据绑定到这个ID上,接着glTexImage2D的调用就可以初始化纹理。
G. 设置心跳
要使程序产生动画的效果,我们需要有一个心跳,每隔一段时间就产生一帧动画。我们使用Qt/Embedded里面的QTimer类和connect函数,使用:
connect( &iTimer, SIGNAL(timeout()), this, SLOT(renderFrame()));
timer.start(40);
其中timer是QTimer的一个对象,renderFrame是场景产生函数,就是timer每心跳一次就调用一次的函数,这样就可以使得程序可以在每隔40毫秒就产生一帧动画,也就是每秒25帧。
H. 场景产生函数
场景产生函数是产生一帧动画场景的过程,可以通过一些变换的措施,使得前后两帧图像产生渐变,于是就会有动画的效果。
场景产生函数中首先要清除前一帧产生的颜色或深度缓冲区,然后可以进行背景绘制,表面剔除,多边形模式,混合模式等等设置。然后可以调用glTranslatef平移视图,调用glRotatef旋转视图,这是产生动画常用等方法。接着就可以绘制我们等立方体了,由于Klimt是支持glBegin/glEnd等,所以绘制三维图形等操作要放在glBegin和glEnd之间,如果不同等图形直接要使用不同等纹理,那么只要在绘制每个图形之前调用glBindTexture绑定需要等已经初始化等纹理ID就可以了;可以使用glTexCoord2f函数渲染纹理,使用glVertex3f函数绘制顶点。这个glBegin和glEnd中等过程可以使用displayList提高效率。
I. 编写Qt/Embedded程序
写了产生场景等类后我们就可以根据前面介绍的Qt/Embedded程序开发方法,写一个Qt/Embedded程序的main函数,然后调用上面这个类的对象,就可以在Qt/Embedded的窗口上显示3D动画了。
这样就基本完成了一个基于Klimt的嵌入式3D动画程序的开发,如果要开发更加复杂的动画,则需要更复杂的代码设计过程。
J. 程序运行效果

程序效果图

 
 
Copyright (C) duwchy, Please give source when reprint.

抱歉!评论已关闭.