关于glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLfloat z)的参数的一些理解

本文详细探讨了glRotatef()函数中x,y,z参数的具体含义,从初始困惑到深入理解,揭示了这些参数不仅表示旋转方向,更表示围绕特定向量旋转。通过实例验证了将x,y,z视为一个整体向量的重要性。
今天仔细研究了一下glRotatef()函数参数的具体意义。angle毋庸置疑就是旋转的角度,而x,y,z三个参数则应该看成一个整体表示一个向量,表示物体围绕向量[x,y,z]旋转。下面就具体谈谈自己发现这几个参数意义的过程。
刚看glRotatef()函数的时候对各个参数的意义很是不明白,自己上网查了一查,但发现网上说的却不是我想要的答案。于是潜下心来研究了一番。刚开始看的时候在参数angle上根本就没花什么时间,对于x,y,z三个参数的研究主要分为了如下几个个过程。初看的时候是对三个参数分个来研究的,发现如果x,y,z中仅有一个不为0的话,例如x不为0,若x>0,则表示绕x轴正方向旋转angle度,若x<0,则表示绕x轴负方向旋转angle度,不论x的值是多大,即1.0和0.1代表的都是绕x轴正方向旋转angle度。于是就初步下了一个结论,即x,y,z只表示了三个状态,即大于0表示绕该轴正方向旋转,小于0表示绕该轴负方向旋转,等于0就表示绕该轴不旋转。但是当x,y,z三个参数中至少有两个不为0的时候发现根本不是那么回事,因为当x不为0且为一个定值的时候,y取不同值物体旋转的状态根本就不一样,这就推翻了我第一次的假想。到了这里似乎就遇到了一个瓶颈,任我如何想都想不明白,到了吃饭的时间居然都感觉不到饿。后来实在没有办法的时候还是打算先去吃饭,刚穿上外衣的时候突然一个想法闪进我的脑海,为什么不把x,y,z看成一个整体呢?带着这个疑问我思考了一路,越想越兴奋,最后才向x,y,z应该表示一个向量,即物体旋转时所围绕的那个向量。回来后测试了一下发现[0,1,1]和[0,2,2]所产生的旋转效果是一样的,后来又测试了几组值,我对自己的猜想更加地肯定了。
虽然更加肯定了自己的想法,但还是不能说明它是百分之百正确的,还希望各位找找看看能不能再补充一点或者添加一些其他函数参数意义的说明。
#include <GL/glut.h> #include<math.h> using namespace std; #define PI 3.14159265354 GLfloat CIRCLE = 1.2f; GLfloat CIRCLE2 = 1.0f; int point = 720; GLfloat z = -5.0f; //用于记录平移距离 void init(void) { glClearColor(0.0, 0.0, 0.0, 0.0); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); } void Reshape(GLsizei w, GLsizei h) { //重置窗口大小 glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, 1.0 * (GLfloat)w / (GLfloat)h, 1.0, 30.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0, 0.0, -3.6); } // 显示函数,采用堆栈的方式 void display() { glClearColor(1, 1, 1, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); // 设置单位矩阵 glTranslatef(0.0f, 0.0f, z); glLoadIdentity(); glRotatef(1, 1.0f, 0.0f, 0.0f); double angle1 = 2 * PI / point; glPushMatrix(); // 绘制蓝色圆环 glColor4f(0, 0, 1, 0.7); glTranslatef(-2.4f, 1.0f, z); double angle2 = 0.0; glBegin(GL_LINE_STRIP); for (int i = 0; i <= point; i++) { angle2 += angle1;//每次循环加一度 glVertex2d(CIRCLE * cos(angle2), CIRCLE * sin(angle2));//利用三角函数定位每次绘画的点的位置 glVertex2d(CIRCLE2 * cos(angle2), CIRCLE2 * sin(angle2)); } glEnd(); glPopMatrix(); glPushMatrix(); // 补充黄色圆环 glColor4f(1, 0.7, 0, 0.9); glTranslatef(-1.2f, 0.0f, z); angle2 = 0.0; glBegin(GL_LINE_STRIP); for (int i = 0; i <= point; i++) { angle2 += angle1;//每次循环加一度,共进行60次循环,实现绘画一个60度的扇形的效果 glVertex2d(CIRCLE * cos(angle2), CIRCLE * sin(angle2)); glVertex2d(CIRCLE2 * cos(angle2), CIRCLE2 * sin(angle2)); } glEnd(); glPopMatrix(); glPushMatrix(); //绘制黑色圆环 glTranslatef(0.1f, 1.0f, z); glColor4f(0, 0, 0, 0.7); angle2 = 0.0; glBegin(GL_LINE_STRIP); for (int i = 0; i <= point; i++) { angle2 += angle1;//每次循环加一度 glVertex2d(CIRCLE * cos(angle2), CIRCLE * sin(angle2)); glVertex2d(CIRCLE2 *
03-19
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值