OpenGL的glRotatef旋转变换函数详解
OpenGL的glRotatef旋转变换函数详解
先看一下函数定义:
void glRotatef(GLfloat angle,
GLfloat x,
GLfloat y,
GLfloat z)
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是右手原则。
最后附上代码供参考:
#include <stdio.h>
#include <gl/glut.h> /*
功能描述:使用OpenGL简单画一个旋转的三角形
旋转变换函数glRotatef
*/ //输出模式,0-单缓存模式;非0双缓存模式
#define OUTPUT_MODE 1 //角度
int angle = ; int xyz[] = {, , }; void display(void)
{
//printf("xyz={%d, %d, %d\n}", xyz[0], xyz[1], xyz[2]); glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity();
glRotatef(angle, xyz[], xyz[], xyz[]); glBegin(GL_TRIANGLES);
{
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.5f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.5f, 0.0f);
}
glEnd(); angle += ;
angle %= ; if (OUTPUT_MODE == ) {
glFlush();//单缓存GLUT_SINGLE时使用
} else {
glutSwapBuffers();//因为使用的是双缓存GLUT_DOUBLE,所以这里必须要交换缓存才会显示
}
} //按键
void keyboard(unsigned char key, int x, int y)
{
switch (key)
{
case 'x':
case 'X':
xyz[] = ;
xyz[] = xyz[] = ;
break;
case 'y':
case 'Y':
xyz[] = ;
xyz[] = xyz[] = ;
break;
case 'z':
case 'Z':
xyz[] = ;
xyz[] = xyz[] = ;
break;
case 'a':
case 'A':
xyz[] = xyz[] = xyz[] = ;
break;
case 'b':
case 'B':
xyz[] = xyz[] = xyz[] = ;
break;
default:
break;
}
printf("当前绕%c轴旋转\n", key);
glutPostRedisplay();
} void reshape(int w, int h)
{
int offset = ;
int dis = (w > h ? h : w) - offset * ; //配置显示物体屏幕的大小
glViewport(offset, offset, (GLsizei)dis, (GLsizei)dis);
printf("reshape: w=%d, h=%d, dis=%d\n", w, h, dis); glMatrixMode(GL_PROJECTION);
glLoadIdentity(); glOrtho(-1.5, 1.5, -1.5, 1.5, , );
//gluOrtho2D(-1.5, 1.5, -1.5, 1.5); glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
} int main(int argc, char *argv[])
{
printf("可通过按键xyzab控制图形旋转原点/轴\n");
glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | (OUTPUT_MODE == ? GLUT_SINGLE : GLUT_DOUBLE));
glutInitWindowPosition(, );
glutInitWindowSize(, ); glutCreateWindow("第一个 OpenGL 程序"); glutDisplayFunc(&display);
glutIdleFunc(display); //设置不断调用显示函数
glutReshapeFunc(reshape);
glutKeyboardFunc(&keyboard);
glutMainLoop();
return ;
}
OpenGL的glRotatef旋转变换函数详解的更多相关文章
- OpenGL的glTranslatef平移变换函数详解
OpenGL的glTranslatef平移变换函数详解 glTranslated()和glTranslatef()这两个函数是定义一个平移矩阵,该矩阵与当前矩阵相乘,使后续的图形进行平移变换. 我们先 ...
- OpenGL的glScalef缩放变换函数详解
glScalef是openGL中的模型缩放函数,就是把当前矩阵与一个表示延各个轴对物体进行拉伸.压缩.反射的矩阵相乘.这个物体的每个点的x,y,z坐标与对应的xyz参数相乘. 先看函数定义void g ...
- OpenGL的gluLookAt观察变换函数详解
void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble center ...
- OpenGL的glViewport视口变换函数详解[转]
调用glViewPort函数来决定视见区域,告诉OpenGL应把渲染之后的图形绘制在窗体的哪个部位.当视见区域是整个窗体时,OpenGL将把渲染结果绘制到整个窗口. void glViewPort(G ...
- OpenGL的gluPerspective透视投影变换函数详解[转]
函数原型void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar) 首先得设置gluPersp ...
- 【转载】D3DXMatrixLookAtLH视图变换函数详解
原文:D3DXMatrixLookAtLH视图变换函数详解 /*D3DXMatrixLookAtLH函数返回的是世界->视图变换矩阵. 视图坐标系和局部坐标系是一样的,都是世界坐标系转换为指定的 ...
- OpenGL ES: (4) EGL API详解 (转)
上一节我们初步学习了 OpenGL ES.EGL.GLSL 的相关概念,了解了它们的功能,以及它们之间的关联.我们知道了 EGL 是绘制 API(比如 OpenGL ES)与 底层平台窗口系统之间的接 ...
- moviepy音视频剪辑:与大小相关的视频变换函数详解
☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>介绍了剪辑基类的fl.fl_time.fx方法,在<movi ...
- OpenGL的glOrtho平行投影函数详解[转]
glortho函数可以将当前的可视空间设置为正投影空间.基参数的意义如图,如果绘制的图空间本身就是二维的,可以使gluOrtho2D.他的使用类似于glOrtho 原型是: void glOrtho( ...
随机推荐
- Session机制(是对cookie的作用的提升,使用较多)
1.Session作用类似于购物车,第一次,放入物品,可以获得Session的id,并可以设置id失效的时间,这样便于多次将物品放在购物车里面,使用的就是获取的Session的id: 2.Sessio ...
- python-haproxy作业讲解视频总结
刚看完瞎驴的haproxy配置文件的作业讲解视频: 总结: 1.用户输入的字符串数据类型转换其他数据类型 1.1 eval('用户输入的数据') 1.2 json.loads('用户输入的数据') 2 ...
- Poj(2679),SPFA,邻接表(主流写法)
题目链接:http://poj.org/problem?id=3268 题意: 有编号为1-N的牛,它们之间存在一些单向的路径.给定一头牛的编号,其他牛要去拜访它并且拜访完之后要返回自己原来的位置,求 ...
- C#自动化IO/XML作业
PS:这是我们公司自动化测试留的一个作业,虽然我不是自动化的,但是也做了一下. Friday, November 28, 2014 这个也是我根据自动化部门的那次作业自己分析写的,没有写打log的过 ...
- 大型网站技术架构介绍--squid
一.大型网站技术架构介绍 1.pv高 ip高 并发量 2.大型网站架构重点 1. 高性能:响应时间,TPS,系统性能计数器.缓存,消息队列等. 高可用性High Availabilit ...
- C++引入自定义类(同一项目下 和 不同项目下的 区别)
今天遇到的问题,使用其他项目中的类时,引入头文件无效,然后发现如下: 项目B: 自定义类B BPro.h #include<iostream> using namespace std; c ...
- haha
[问题描述] 栈是一种强大的数据结构,它的一种特殊功能是对数组进行排序.例如,借助一个栈,依次将数组1,3,2按顺序入栈或出栈,可对其从大到小排序:1入栈:3入栈:3出栈:2入栈:2出:1出栈.在上面 ...
- 正确修改MySQL最大连接数的三种好用方案
以下的文章主要介绍的是正确修改MySQL最大连接数的三种好用方案,我们大家都知道MySQL数据库在安装完之后,默认的MySQL数据库,其最大连接数为100,一般流量稍微大一点的论坛或网站这个连接数是远 ...
- OpenLayers学习记录(1)
1.部署自己的服务器 首先下载openlayers的源码.解压后里面有很多内容.我们只需要拷贝目录下的OpenLayer.js.根目录下的lib目录.根目录下的img目录 theme目录 到你网站的o ...
- MIME协议生成邮件
MIME协议生成一封复杂的邮件 MIME协议是对RFC822文档的升级和补充,用MIME协议能生成一封有文字.图片和附件的复杂邮件.首先要导入activation.jar和mail.jar.Mail. ...