看opengl写代码(3) 实现矩阵的旋转

参考   opengl编程指南   P17   

直接上代码:

<span style="font-size:18px;">// doubleBuffer.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <gl/glut.h>
static GLint spin = 0;

void init(){
	glClearColor(0.0,0.0,0.0,0.0);
	glShadeModel(GL_FLAT);//使用单一着色
}

void display(){
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0,0.0,0.0);
	glPushMatrix();
	glRotated(spin,1.0,0.0,1.0);
	//glRectf(25.0,25.0,100.0,100.0);
	glRectf(0,0,1,1);
	//glRectf(-0.25,-0.25,0.25,0.25);
	glPopMatrix();

	glutSwapBuffers();
}

void spinDisplay(){
	spin += 2;
	spin = spin % 360;
	glutPostRedisplay();
}

void mouse(int button,int state,int x,int y){
	switch (button)
	{
	case GLUT_LEFT_BUTTON:
		if (state == GLUT_DOWN){
			glutIdleFunc(spinDisplay);
		}
		break;
	case GLUT_RIGHT_BUTTON:
		if(state == GLUT_DOWN){
			glutIdleFunc(NULL);
		}
	default:
		break;
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	glutInit(&argc,(char**)argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
	glutInitWindowSize(500,500);
	glutInitWindowPosition(0,0);
	glutCreateWindow("双缓冲");
	init();
	glutDisplayFunc(display);
	glutMouseFunc(mouse);
	glutMainLoop();
	return 0;
}
</span>

写的过程中 遇到 一些 新的 函数:

1.glShadeModel(GL_FLAT); 还有 一个 参数 是 GL_SMOOTH(默认值)。他们的区别是 当你 给 一个多边形 的 顶点 指定 不同 颜色时,矩阵中 的颜色 是 单一(Gl_Flat),还是

平滑的 过度(Gl_SMOOTH).

2. glRotated 函数, 旋转 函数 ,对 当前 矩阵  进行 操作

3. glPushMatrix();

glRotated(spin,1.0,0.0,1.0);

glPopMatrix()

glPushMatrix 函数 将 栈顶 矩阵 拷贝一份,然后 将 拷贝的 栈顶 矩阵 入栈。

glPopMatrix 函数 将 栈顶 矩阵 出栈。

将 旋转 函数 放入 这两个 函数 之间 ,是 为了 在旋转后,恢复到旋转之前的 栈顶 矩阵状态。

看不懂? 这里 有一个 解释的 还算 可以的 :http://blog.sina.com.cn/s/blog_70c3d9ed010122bp.html

4.glRectf 函数,传 两组 坐标进去,一个 在 左下角,一个 在 右上角,画一个矩阵出来。

关于 矩阵的 参数 ,书上 给的 glrectf(-25.0,-25.0,25.0,25.0) 我 认为 是 错误的 。

glrectf 参数 应该 是 在 -1 ~ 1 之间的 。是 opengl 世界 坐标系坐标,原点 在 屏幕中心 。 不懂 可以 百度。

5.glutIdleFunc设置全局的回调函数,当没有窗口事件到达时,GLUT程序功能可以执行后台处理任务或连续动画。如果启用,这个idle
function会被不断调用,直到有窗口事件发生。回调函数没有参数。当前的窗口和菜单在执行idle func之前不会改变。当程序依赖多窗口或菜单时最好不要依赖于当前设定。

6.

if(state == GLUT_DOWN)      //callback was due to a press (of a mouse button)
                                               //相当于“如果某个鼠标键被按下”
if(state == GLUT_UP)            //callback was due to a release (of a mouse button)
                                               //相当于“如果某个鼠标键被放开(弹起)”
if (button== GLUT_left_BUTTON)   //callback was due to a release/press of the left button
                                                             //相当于“如果鼠标左键被按下或者被放开”
if (button== GLUT_right_BUTTON) //callback was due to a release/press of the right button
                                                             //相当于“如果鼠标右键被按下或者被放开”
if (button== GLUT_MIDDLE_BUTTON) //callback was due to a release/press of the MIDDLE
                                                               //button
                                                               //相当于“如果鼠标中键被按下或者被放开” 

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 02:50:49

看opengl写代码(3) 实现矩阵的旋转的相关文章

看openGl写代码(11) 第一个 三维物体

1.在 写这段 程序 的 一开始 ,图形 没有 出来,因为 在 reShape函数 没写 投影矩阵的 函数: 2.还有 这段程序 我跟踪了 一下,首先  执行 reShape ,然后 才是 disPlay 函数,挺奇怪的. 等待 以后自己解答!如果 有好心的 博友 解答就是 极好的了. 学习了 新的 几个 OPENGL 函数.但是 对于 为什么 图形 会这样, 不明白!!! void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdo

看opengl写代码(10) 使用属性数组

众所周知,OPENGL 是一个状态机,有很多 各种 各样的 状态.我们 可以 使用 属性数组 来 保存 / 恢复 一组 状态.总共 有 20组 服务器属性组  和 2组 客户端属性组. 关于 这些属性组 里 有哪些 属性. 这个网站 详细 说明了: http://www.cnblogs.com/oiramario/archive/2010/04/13/1711114.html glPushAttrib(mask) :参数 mask  代表着 某种属性组: 函数 将 属性组 的 当前 属性 入栈.

看opengl 写代码(4) 画一个圆

opengl 编程指南 P30 下面代码 是 用 直线 连起来 画一个圆. // circle.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <gl/glut.h> #include <cmath> #define LENGTH 100 #define PI 3.1415926 void init(){ glClearColor(0,0,0,0); } void display(){ glColor3f

看 opengl 写代码(1) 搭建开发环境(vs2012 + glut)

博主 无私奉献:(vs2012 + glut) 开发 环境 配置 序:看到本文章,祝贺你,你至少省掉了 1 个小时 苦苦寻找 搭建 方法的时间. 下面搭建方法为本博主 亲测.有事 可以 留言 或者 私密我. 1.从我的网盘里 下载 glut http://pan.baidu.com/s/1dDGYnp3 2.下载完 以后 ,会 有 5个 文件 和 一个 说明 txt 具体 操作 如下: 32位Windows环境下安装GLUT的步骤 1.将glut.h复制到C:\Program Files (x8

看opengl写代码(7) 使用混合数组(glInterLeavedArrays)

glInterLeavedArrays 函数  有 三个 参数 : mode ,stride,pointer. mode :指示 开启 哪些 顶点数组,以及 顶点数组 使用的 数据类型.其余的 顶点数组 关闭.总共有14组.具体 可以 参加 <OPENGL 编程指南>2.6.6混合数组 小节. stride: 指示了 顶点 数据 之间的 间隔.一般 为0 pointer: 指针,指向 顶点数组 数据. 使用 glInterLeavedArrays  会 提高 应用程序的性能.并且 数据 的准确

看opengl写代码(6)glArrayElement,,glDrawElements和glDrawArrays

glArrayElement,,glDrawElements和glDrawArrays: 这三个 都是 使用 顶点 数组 绘制的 OpenGl函数. glArrayElement 每次 只能 使用 一组 顶点数据,并且 必须 在 GLbegin 和 glend 之间 绘制. glDrawElements 每次 可以 绘制 多组 顶点数据,顺序 可以 任意 存放,无  glBegin 和 glend 的限制. glDrawArrays 每次 可以绘制 多组顶点数据,必须 从 起点 到 终点 按顺序

看数据结构写代码(32) 赫夫曼树编码以及译码

杂谈:最近有点慵懒,不好不好.好几天都没写代码,原本准备上星期完结 树 这一章节的.现在 又耽误了.哎.要抓紧时间啊. 下面直接上代码: 可以到我的网盘下载源代码,或者 直接拷贝下面的源代码 运行 网盘地址:点击打开链接 // HuffmanTree.cpp : 定义控制台应用程序的入口点. //哈弗曼编码,译码 #include "stdafx.h" #include <stdlib.h> #include <cstring> enum E_State { E

看数据结构写代码(21) 稀疏矩阵(十字链表方式)

写完 这个样例,花费了 我不少时间.大部分时间 花费在 调试 内存问题上. 比如在销毁十字链表时.多次释放节点空间,造成 _CrtIsValidHeapPointer(pUserData) 异常. 当使用malloc 分配 一个 空间时,会将这个空间的起始地址和长度 加到一个链表中去.free(p)的时候 ,会从 链表里 查找 是否 有 这个地址空间,找到了就将这个节点从链表中删除._CrtIsValidHeapPointer(pUserData)  这个函数 正是 检查 这个空间是否 在链表里

看数据结构写代码(50)伙伴系统

伙伴系统 是一种 只 可以 分配 2的 幂次方 个 空间的 ,回收 内存 时 只 合并 "伙伴空间" 的一种 动态内存管理方式. 例如 一个 空间 大小 为 64 的 内存,伙伴 系统 为 这 64 的内存  建立 一组 双向循环 链表,分别 管理着  2的 0 次方,2的1 次方幂,2的 2 次方幂...2的6次方幂的 可用空间. 即使 我们 只想分配 一个 大小 为3的 空间,系统 却 只能 返回 一个 内存 大小 为 4(2的2次方)的 一个空间. 系统 在 初始化的 时候 ,并