AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

OpenGL编程轻松入门之动画制作

51自学网 2015-08-30 http://www.wanshiok.com
  到目前为止我们所做的图形全部都是静止的。而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程序可以执行后台任务或连续动画。

 

 

 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
上一篇:谈&nbsp;自动事件&nbsp;和&nbsp;手工事件&nbsp;的区别  下一篇:OpenGL编程轻松入门之像素操作