【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



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