OpenGL的glRotatef旋转变换函数详解 - 博客园

文章推薦指數: 80 %
投票人數:10人

OpenGL的glRotatef旋转变换函数详解先看一下函数定义:void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) ang. 首页 新闻 博问 专区 闪存 班级 我的博客 我的园子 账号设置 简洁模式... 退出登录 注册 登录 1024Planet 寻找1024的猿人︿( ̄︶ ̄)︽( ̄︶ ̄)︿飞.飞.飞. OpenGL的glRotatef旋转变换函数详解 OpenGL的glRotatef旋转变换函数详解 先看一下函数定义:voidglRotatef(GLfloatangle,        GLfloatx,         GLfloaty,         GLfloatz) angle:为旋转的角度,单位为度。

x,y,z:为对应xyz轴的布尔值变量。

重点是x,y,z表达的是什么意思呢?应该如何取值?如果说x,y,z表达的是一个坐标(x,y,z),那么这个函数就说明了当前几何图形围着这个坐标点旋转。

但往哪个方向旋转呢?所以很明显,x,y,z表达的意思并不是坐标点,而是要围绕哪个坐标轴旋转。

即其实这里的x,y,z值相当于一个布尔值,0.0表示假,而非零参数则表示真。

所以如果你想让当前的几何图形围绕着z轴旋转,那么x和y都设为0,而z设为非零值即可。

如果这里的x,y,z的值都设置为0.0,那么将围绕着x轴旋转。

还有一点需要注意,如果设置的旋转值(x,y,z的值)为正数,那么旋转的方向是逆时针的,如果旋转值是负数,那么旋转的方向是顺时针的。

假设:glRotatef(45,1,0,0) 物体如何旋转?想象:从坐标(0,0,0)即原点,引出一条线到(1,0,0),用右手握住这条线.这时,你会问,如何握?右手大拇指指向(0,0,0)至(1,0,0)的方向才握。

另外四个手指的弯曲指向即是物体旋转方向。

为什么是右手握住,而不是左手呢?因为OpenGL是右手原则。

  最后附上代码供参考: 1#include 2#include 3 4/* 5功能描述:使用OpenGL简单画一个旋转的三角形 6旋转变换函数glRotatef 7*/ 8 9//输出模式,0-单缓存模式;非0双缓存模式 10#defineOUTPUT_MODE1 11 12//角度 13intangle=0; 14 15intxyz[3]={0,0,0}; 16 17voiddisplay(void) 18{ 19//printf("xyz={%d,%d,%d\n}",xyz[0],xyz[1],xyz[2]); 20 21glClear(GL_COLOR_BUFFER_BIT); 22 23 24glLoadIdentity(); 25glRotatef(angle,xyz[0],xyz[1],xyz[2]); 26 27glBegin(GL_TRIANGLES); 28{ 29glVertex3f(0.0f,0.0f,0.0f); 30glVertex3f(0.5f,0.0f,0.0f); 31glVertex3f(0.0f,0.5f,0.0f); 32} 33glEnd(); 34 35angle+=1; 36angle%=360; 37 38if(OUTPUT_MODE==0){ 39glFlush();//单缓存GLUT_SINGLE时使用 40}else{ 41glutSwapBuffers();//因为使用的是双缓存GLUT_DOUBLE,所以这里必须要交换缓存才会显示 42} 43} 44 45//按键 46voidkeyboard(unsignedcharkey,intx,inty) 47{ 48switch(key) 49{ 50case'x': 51case'X': 52xyz[0]=1; 53xyz[1]=xyz[2]=0; 54break; 55case'y': 56case'Y': 57xyz[1]=1; 58xyz[0]=xyz[2]=0; 59break; 60case'z': 61case'Z': 62xyz[2]=1; 63xyz[0]=xyz[1]=0; 64break; 65case'a': 66case'A': 67xyz[0]=xyz[1]=xyz[2]=0; 68break; 69case'b': 70case'B': 71xyz[0]=xyz[1]=xyz[2]=1; 72break; 73default: 74break; 75} 76printf("当前绕%c轴旋转\n",key); 77glutPostRedisplay(); 78} 79 80voidreshape(intw,inth) 81{ 82intoffset=50; 83intdis=(w>h?h:w)-offset*2; 84 85//配置显示物体屏幕的大小 86glViewport(offset,offset,(GLsizei)dis,(GLsizei)dis); 87printf("reshape:w=%d,h=%d,dis=%d\n",w,h,dis); 88 89glMatrixMode(GL_PROJECTION); 90glLoadIdentity(); 91 92glOrtho(-1.5,1.5,-1.5,1.5,0,10); 93//gluOrtho2D(-1.5,1.5,-1.5,1.5); 94 95glMatrixMode(GL_MODELVIEW); 96glLoadIdentity(); 97} 98 99intmain(intargc,char*argv[]) 100{ 101printf("可通过按键xyzab控制图形旋转原点/轴\n"); 102glutInit(&argc,argv); 103 104glutInitDisplayMode(GLUT_RGB|(OUTPUT_MODE==0?GLUT_SINGLE:GLUT_DOUBLE)); 105glutInitWindowPosition(100,100); 106glutInitWindowSize(400,400); 107 108glutCreateWindow("第一个OpenGL程序"); 109 110glutDisplayFunc(&display); 111glutIdleFunc(display);//设置不断调用显示函数 112glutReshapeFunc(reshape); 113glutKeyboardFunc(&keyboard); 114glutMainLoop(); 115return0; 116}   posted@ 2016-07-0616:15  追寻1024的程序猿  阅读(31879)  评论(0)  编辑  收藏  举报 刷新评论刷新页面返回顶部 Copyright©2022追寻1024的程序猿 Poweredby.NET6onKubernetes



請為這篇文章評分?