【android】Glut glRotatef glTranslatef示例程序:

Demo使用glRotatef ,glTranslatef来实现一个太阳、地球、月亮运动的3D图形。

1.glTranslatef() ——模型变换函数 移动

void glTranslatef(GLfloat  x,  GLfloat  y,  GLfloat  z);

这个函数表示模型是怎样移动的。举个例子:

glTranslatef(-1.0,0.0,-2.0);//表示物体沿x负方向移动1.0,沿z轴负方向移动2.0。

2.glRotatef()——模型变换函数  旋转

void glRotatef(GLfloat  angle,  GLfloat  x,  GLfloat  y,  GLfloat  z);

angle表示旋转的角度(注意单位不是弧度),(x,y,z)表示转轴。举个例子:

glRotatef(45.0, 0.0, 0.0, 1.0);//表示模型沿着(0,0,1)这个轴旋转45°。

3.glPerspective() ——投影变换函数 透视投影

void gluPerspective(GLdouble  fovy,  GLdouble  aspect,  GLdouble  zNear,  GLdouble  zFar);

glPerspective函数的相关参数代表的意义参看下图:

fovy视角宽度

aspect:w/h


平移、旋转、以及缩放效果:

正交投影以及透视投影:


正交投影下显示效果:


右击鼠标右键菜单选择是否显示座标轴以及透视和正交投影模式:


透视投影:


源代码:

  1. // GlutSolarDemo.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include <gl/glut.h>  
  6. #include <math.h>  
  7. //圆周率宏  
  8. #define GL_PI 3.1415f  
  9. //获取屏幕的宽度  
  10. GLint SCREEN_WIDTH=0;  
  11. GLint SCREEN_HEIGHT=0;  
  12. //设置程序的窗口大小  
  13. GLint windowWidth=400;  
  14. GLint windowHeight=300;  
  15. //绕x轴旋转角度  
  16. GLfloat xRotAngle=0.0f;  
  17. //绕y轴旋转角度  
  18. GLfloat yRotAngle=0.0f;  
  19. //受支持的点大小范围  
  20. GLfloat sizes[2];  
  21. //受支持的点大小增量  
  22. GLfloat step;  
  23. //最大的投影矩阵堆栈深度  
  24. GLint iMaxProjectionStackDepth;  
  25. //最大的模型视图矩阵堆栈深度  
  26. GLint iMaxModeviewStackDepth;  
  27. //最大的纹理矩阵堆栈深度  
  28. GLint iMaxTextureStackDepth;  
  29.   
  30. GLfloat  whiteLight[] = { 0.4f, 0.4f, 0.4f, 1.0f };  
  31. GLfloat  sourceLight[] = { 0.8f, 0.8f, 0.8f, 1.0f };  
  32. GLfloat  lightPos[] = { 0.0f, 0.0f, 0.0f, 1.0f };  
  33.   
  34. GLint iCoordinateaxis=2;  
  35. GLint iProjectionMode=1;  
  36. void changSize(GLint w,GLint h);  
  37. //菜单回调函数  
  38. void processMenu(int value){  
  39.     switch(value){  
  40.         case 1:  
  41.             iCoordinateaxis=1;  
  42.             break;  
  43.         case 2:  
  44.             iCoordinateaxis=2;  
  45.             break;  
  46.         case 3:  
  47.             iProjectionMode=1;  
  48.             //强制调用窗口大小变化回调函数,更改投影模式为正交投影  
  49.             changSize(glutGet(GLUT_WINDOW_WIDTH),glutGet(GLUT_WINDOW_HEIGHT));  
  50.             break;  
  51.         case 4:  
  52.             iProjectionMode=2;  
  53.             //强制调用窗口大小变化回调函数,更改投影模式为透视投影  
  54.             changSize(glutGet(GLUT_WINDOW_WIDTH),glutGet(GLUT_WINDOW_HEIGHT));  
  55.             break;  
  56.         default:  
  57.             break;  
  58.     }  
  59.     //重新绘制  
  60.     glutPostRedisplay();  
  61. }  
  62. //显示回调函数  
  63. void renderScreen(void){  
  64.     static float fMoonRot = 0.0f;  
  65.     static float fEarthRot = 0.0f;  
  66.     //将窗口颜色清理为黑色  
  67.     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);  
  68.     //把整个窗口清理为当前清理颜色:黑色;清除深度缓冲区。  
  69.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);  
  70.   
  71.     //将当前Matrix状态入栈  
  72.     glPushMatrix();  
  73.     if(2==iProjectionMode)  
  74.         glTranslatef(0.0f, 0.0f, -250.0f);  //透视投影为便于观察整个座标系往内移动250个单位  
  75.     //座标系绕x轴旋转xRotAngle  
  76.     glRotatef(xRotAngle,1.0f,0.0f,0.0f);  
  77.     //座标系绕y轴旋转yRotAngle  
  78.     glRotatef(yRotAngle,0.0f,1.0f,0.0f);  
  79.     //进行平滑处理   
  80.     glEnable(GL_POINT_SMOOTH);  
  81.     glHint(GL_POINT_SMOOTH,GL_NICEST);  
  82.     glEnable(GL_LINE_SMOOTH);  
  83.     glHint(GL_LINE_SMOOTH,GL_NICEST);  
  84.     glEnable(GL_BLEND);  
  85.     glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);  
  86.   
  87.     //白色绘制座标系  
  88.     if(1==iCoordinateaxis){  
  89.         glColor3f(1.0f,1.0f,1.0f);  
  90.         glBegin(GL_LINES);  
  91.             glVertex3f(-90.0f,00.0f,0.0f);  
  92.             glVertex3f(90.0f,0.0f,0.0f);  
  93.             glVertex3f(0.0f,-90.0f,0.0f);  
  94.             glVertex3f(0.0f,90.0f,0.0f);  
  95.             glVertex3f(0.0f,0.0f,-90.0f);  
  96.             glVertex3f(0.0f,0.0f,90.0f);  
  97.         glEnd();  
  98.   
  99.         glPushMatrix();  
  100.         glTranslatef(90.0f,0.0f,0.0f);  
  101.         glRotatef(90.0f,0.0f,1.0f,0.0f);  
  102.         glutSolidCone(3,6,10,10);  
  103.         glPopMatrix();  
  104.   
  105.         glPushMatrix();  
  106.         glTranslatef(0.0f,90.0f,0.0f);  
  107.         glRotatef(-90.0f,1.0f,0.0f,0.0f);  
  108.         glutSolidCone(3,6,10,10);  
  109.         glPopMatrix();  
  110.   
  111.         glPushMatrix();  
  112.         glTranslatef(0.0f,0.0f,90.0f);  
  113.         glRotatef(70.0f,0.0f,0.0f,1.0f);  
  114.         glutSolidCone(3,6,10,10);  
  115.         glPopMatrix();  
  116.     }  
  117.   
  118.     glPushMatrix();  
  119.   
  120.     glDisable(GL_LIGHTING);  
  121.     //Draw sun at(0.0f,0.0f,0.0f)  
  122.     glColor3ub(255, 255, 0);  
  123.     glutSolidSphere(15.0f, 30, 17);  
  124.     glEnable(GL_LIGHTING);  
  125.   
  126.     //Move the light after we draw the sun!  
  127.     glLightfv(GL_LIGHT0,GL_POSITION,lightPos);  
  128.   
  129.     //Rotate coordinate system  
  130.     glColor3ub(0,0,255);  
  131.     glRotatef(fEarthRot, 0.0f, 1.0f, 0.0f);  
  132.     fEarthRot += 5.0f;  
  133.     if(fEarthRot > 360.0f)  
  134.         fEarthRot = 0.0f;  
  135.     glTranslatef(105.0f,0.0f,0.0f);  
  136.     //Draw the Earth  
  137.     glutSolidSphere(15.0f, 30, 17);  
  138.   
  139.     //Rotate from Earth based coordinates and draw Moon  
  140.     glColor3ub(200,200,200);  
  141.     glRotatef(fMoonRot,0.0f, 1.0f, 0.0f);  
  142.     fMoonRot+= 15.0f;  
  143.     if(fMoonRot > 360.0f)  
  144.         fMoonRot = 0.0f;  
  145.     glTranslatef(30.0f, 0.0f, 0.0f);  
  146.     glutSolidSphere(6.0f, 30, 17);  
  147.   
  148.     glPopMatrix();  
  149.   
  150.   
  151.     //恢复压入栈的Matrix  
  152.     glPopMatrix();  
  153.     //交换两个缓冲区的指针  
  154.     glutSwapBuffers();  
  155. }  
  156. //设置Redering State   
  157. void setupRederingState(void){  
  158.       
  159.     // Enable lighting  
  160.     glEnable(GL_LIGHTING);  
  161.     // Setup and enable light 0  
  162.     glLightModelfv(GL_LIGHT_MODEL_AMBIENT,whiteLight);  
  163.     glLightfv(GL_LIGHT0,GL_DIFFUSE,sourceLight);  
  164.     glLightfv(GL_LIGHT0,GL_POSITION,lightPos);  
  165.     glEnable(GL_LIGHT0);  
  166.     // Enable color tracking  
  167.     glEnable(GL_COLOR_MATERIAL);  
  168.     // Set Material properties to follow glColor values  
  169.     glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);  
  170.       
  171.     glEnable(GL_DEPTH_TEST);    //使能深度测试  
  172.     glFrontFace(GL_CCW);        //多边形正面为逆时针方向  
  173.     glEnable(GL_CULL_FACE);     //不显示背面  
  174.   
  175.     //设置清理颜色为黑色  
  176.     glClearColor(0.0f,0.0,0.0,1.0f);  
  177.     //设置绘画颜色为绿色  
  178.     glColor3f(1.0f,1.0f,0.0f);  
  179.     //使能深度测试  
  180.     glEnable(GL_DEPTH_TEST);  
  181.     //获取受支持的点大小范围  
  182.     glGetFloatv(GL_POINT_SIZE_RANGE,sizes);  
  183.     //获取受支持的点大小增量  
  184.     glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step);  
  185.     //获取最大的投影矩阵堆栈深度  
  186.     glGetIntegerv( GL_MAX_PROJECTION_STACK_DEPTH,&iMaxProjectionStackDepth);  
  187.     //获取最大的模型视图矩阵堆栈深度  
  188.     glGetIntegerv( GL_MAX_MODELVIEW_STACK_DEPTH,&iMaxModeviewStackDepth);  
  189.     //获取最大的纹理矩阵堆栈深度  
  190.     glGetIntegerv( GL_MAX_TEXTURE_STACK_DEPTH,&iMaxTextureStackDepth);  
  191.     printf("point size range:%f-%f\n",sizes[0],sizes[1]);  
  192.     printf("point step:%f\n",step);  
  193.     printf("iMaxProjectionStackDepth=%d\n",iMaxProjectionStackDepth);  
  194.     printf("iMaxModeviewStackDepth=%d\n",iMaxModeviewStackDepth);  
  195.     printf("iMaxTextureStackDepth=%d\n",iMaxTextureStackDepth);  
  196. }  
  197. //窗口大小变化回调函数  
  198. void changSize(GLint w,GLint h){  
  199.     //横宽比率  
  200.     GLfloat ratio;  
  201.     //设置座标系为x(-100.0f,100.0f)、y(-100.0f,100.0f)、z(-100.0f,100.0f)  
  202.     GLfloat coordinatesize=120.0f;  
  203.     //窗口宽高为零直接返回  
  204.     if((w==0)||(h==0))  
  205.         return;  
  206.     //设置视口和窗口大小一致  
  207.     glViewport(0,0,w,h);  
  208.     //对投影矩阵应用随后的矩阵操作  
  209.     glMatrixMode(GL_PROJECTION);  
  210.     //重置当前指定的矩阵为单位矩阵   
  211.     glLoadIdentity();  
  212.     ratio=(GLfloat)w/(GLfloat)h;  
  213.     //正交投影  
  214.     if(1==iProjectionMode){  
  215.         printf("glOrtho\n");  
  216.         if(w<h)  
  217.             glOrtho(-coordinatesize,coordinatesize,-coordinatesize/ratio,coordinatesize/ratio,-coordinatesize*2.0f,coordinatesize*2.0f);  
  218.         else  
  219.             glOrtho(-coordinatesize*ratio,coordinatesize*ratio,-coordinatesize,coordinatesize,-coordinatesize*2.0f,coordinatesize*2.0f);  
  220.         //当前矩阵设置为模型视图矩阵  
  221.         glMatrixMode(GL_MODELVIEW);  
  222.         //重置当前指定的矩阵为单位矩阵   
  223.         glLoadIdentity();  
  224.     }  
  225.     else{  
  226.         printf("gluPerspective\n");  
  227.         gluPerspective(45,ratio,10.0f,500.0f);  
  228.         //当前矩阵设置为模型视图矩阵  
  229.         glMatrixMode(GL_MODELVIEW);  
  230.         //重置当前指定的矩阵为单位矩阵   
  231.         glLoadIdentity();  
  232.     }  
  233.   
  234. }  
  235.   
  236. //按键输入处理回调函数  
  237. void specialKey(int key,int x,int y){  
  238.   
  239.     if(key==GLUT_KEY_UP){  
  240.         xRotAngle-=5.0f;  
  241.     }  
  242.     else if(key==GLUT_KEY_DOWN){  
  243.         xRotAngle+=5.0f;  
  244.     }  
  245.     else if(key==GLUT_KEY_LEFT){  
  246.         yRotAngle-=5.0f;  
  247.     }  
  248.     else if(key==GLUT_KEY_RIGHT){  
  249.         yRotAngle+=5.0f;  
  250.     }  
  251.     //重新绘制  
  252.     glutPostRedisplay();  
  253. }  
  254.   
  255. void timerFunc(int value)  
  256. {  
  257.     glutPostRedisplay();  
  258.     glutTimerFunc(100, timerFunc, 1);  
  259. }  
  260.   
  261. int main(int argc, char* argv[])  
  262. {  
  263.     //菜单  
  264.     GLint iMainMenu;  
  265.     GLint iCoordinateaxisMenu;  
  266.     GLint iOrthoOrPerspectMenu;  
  267.     //初始化glut   
  268.     glutInit(&argc,argv);  
  269.     //使用双缓冲区、深度缓冲区。  
  270.     glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);  
  271.     //获取系统的宽像素  
  272.     SCREEN_WIDTH=glutGet(GLUT_SCREEN_WIDTH);  
  273.     //获取系统的高像素  
  274.     SCREEN_HEIGHT=glutGet(GLUT_SCREEN_HEIGHT);  
  275.     //创建窗口,窗口名字为OpenGL Solar Demo  
  276.     glutCreateWindow("OpenGL Solar Demo");  
  277.     //设置窗口大小  
  278.     glutReshapeWindow(windowWidth,windowHeight);  
  279.     //窗口居中显示  
  280.     glutPositionWindow((SCREEN_WIDTH-windowWidth)/2,(SCREEN_HEIGHT-windowHeight)/2);  
  281.     //窗口大小变化时的处理函数  
  282.     glutReshapeFunc(changSize);  
  283.     //设置显示回调函数   
  284.     glutDisplayFunc(renderScreen);  
  285.     //设置按键输入处理回调函数  
  286.     glutSpecialFunc(specialKey);  
  287.     //菜单回调函数  
  288.     iCoordinateaxisMenu=glutCreateMenu(processMenu);  
  289.     //添加菜单  
  290.     glutAddMenuEntry("Display coordinate axis",1);  
  291.     glutAddMenuEntry("Don't dispaly coordinate axis",2);  
  292.     iOrthoOrPerspectMenu=glutCreateMenu(processMenu);  
  293.     glutAddMenuEntry("Ortho",3);  
  294.     glutAddMenuEntry("Perspect",4);  
  295.     iMainMenu=glutCreateMenu(processMenu);  
  296.     glutAddSubMenu("Display or hide coordinate axis",iCoordinateaxisMenu);  
  297.     glutAddSubMenu("Ortho Or Perspect",iOrthoOrPerspectMenu);  
  298.     //将菜单榜定到鼠标右键上  
  299.     glutAttachMenu(GLUT_RIGHT_BUTTON);  
  300.     glutTimerFunc(250,timerFunc, 1);  
  301.     //设置全局渲染参数  
  302.     setupRederingState();  
  303.     glutMainLoop();  
  304.     return 0;  
  305. }  
转载自http://blog.csdn.net/yearafteryear/article/details/9199945



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章