| 网站首页 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛 |
 
| 技术教程首页 | 开发语言 | WEB开发 | .NET技术 | 数据库 | 操作系统 | 网页制作 |
 
 
您现在的位置: 编程中国 >> 技术教程 >> 开发语言 >> VC++ >> VC教程 >> 正文
  ►  OpenGL编程轻松入门之动画制作
OpenGL编程轻松入门之动画制作
作者:黄燕    阅读人次:……    文章来源:天极开发    发布时间:2006-9-17    网友评论()条
 
  到目前为止我们所做的图形全部都是静止的。而OpenGL的是一个可以制作大型3D图形、动画的工具。下面我们做一个可以旋转的立方体。

  例16:一个旋转的立方体

#include <GL/glut.h>

GLfloat X = 10.0f;
GLfloat Y = 1.0f;
GLfloat Z = 5.0f;

void myDisplay(void)
{
 GLfloat diffuse[] = {0.7,0.7,0.0,1.0};
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 glColor3f(1.0,1.0,1.0);
 /*绘制立方体*/
 glPushMatrix();
 glRotatef(X,1.0,0.0,0.0);
 glRotatef(Y,0.0,1.0,0.0);
 glRotatef(Z,0.0,0.0,1.0);
 glMaterialfv(GL_FRONT,GL_DIFFUSE,diffuse);
 glutSolidCube(1.0);
 glPopMatrix();
 glFlush();
 glutSwapBuffers();//交换当前窗口使用层的缓存
}

void myReshape(int w,int h)
{
 glViewport(0,0,w,h);

 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluOrtho2D(-1.5,1.5,-1.5,1.5);
 if(w <= h)
  glOrtho(-2.25,2.25,-2.25*h/w,2.25*h/w,-10.0,10.0);
 else
  glOrtho(-2.25*w/h,2.25*w/h,-2.25,2.25,-10.0,10.0);

 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
}

void myAnimate(void)
{
 X += 1.0; 
 Y += 1.0;
 Z += 1.0;

 glutPostRedisplay();//标记当前窗口需要重新绘制

}

int main(int argc,char ** argv)
{
 /*初始化*/
 glutInit(&argc,argv);

 glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
 glutInitWindowSize(400,400);
 glutInitWindowPosition(200,200);

 /*创建窗口*/
 glutCreateWindow("color");

 /*绘制与显示*/
 glutReshapeFunc(myReshape);

 glutDisplayFunc(myDisplay);
 glutIdleFunc(myAnimate);//设置全局空闲回调函数

 glutMainLoop();

 return(0);
}

  myDisplay函数中有一个glutSwapBuffers()函数。此函数交换当前窗口使用层的缓存,它将后台缓存中的内容交换到前台缓存中,该函数执行的结果直到显示器垂直回行扫描后才看得到。必须使用双缓存结构,否则此函数不起任何作用。

  myAanimate函数中glutPostRedisplay()函数标记当前窗口需要重新绘制。在glutMainLoop函数的事件处理循环的下一个反复中,将调用该窗口的显示回调函数重绘该窗口的图像层。

  在main函数中glutInitDisplayMode中为GLUT_DOUBLE,而我们以前的很多例子为GLUT_SINGLE。main函数中还调用了glutIdleFunc,此函数设置全局空闲回调函数。,从而使GLUT程序可以执行后台任务或连续动画。

 

 
文章录入:静夜思    责任编辑:静夜思 
  • 上一篇文章:

  • 下一篇文章:

  •  
    相关文章
    原创地带
    24小时热门帖子