四 OpenGL中的变换

一 视点变换

相机位置(视点)的变换

void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,

GLdouble centerx,GLdouble centery, GLdouble centerz ,

GLdouble upx,GLdouble upy,GLdouble upz)

二 模型变换

模型位置的变化

1 平移

glTranslate{fd}(TYPE x,TYPE y,TYPE z);

2 旋转

glRotate{fd}(TYPE angle,TYPE x,TYPE,y,TYPE z);

3 缩放

glScale{fd}(TYPE x,TYPE y,TYPE z);

三 投影变换

将三维模型投影到屏幕上显示。

1 透视投影

离视点近的物体大,离视点远的物体小,远到极点即为消失,成为灭点。

void glFrustum(GLdouble left,GLdouble Right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);

void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear, GLdouble zFar);

2 正视投影

无论物体距离相机多远,投影后的物体大小尺寸不变,正投影相当于在无限远处观察得到的结果。

void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top, GLdouble near,GLdouble far);

void gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top);

四 视口变换

将视景体内投影的物体显示在二维的视口平面上。

glViewport(GLint x,GLint y,GLsizei width, GLsizei height);

五 裁剪变换

除了视景体定义的六个裁剪平面外,还可自定义一个或多个附加裁剪平面,以去掉场景中无关的目标。

void glClipPlane(GLenum plane,Const GLdouble *equation);

六 太阳地球月球示例

#include <glut.h>
#include <stdio.h>
#include <time.h> 

static int day = 200;

double getFPS()
{
	static int count;
	static double save;
	static clock_t last, current;
	double timegap;

	++count;
	if (count <= 50){
		return save;
	}
	count = 0;
	last = current;
	current = clock();
	timegap = (current-last)/(double)CLK_TCK;
	save = 50.0f / timegap;
	return save;
}

void display()
{
	// 打印FPS
	double FPS = getFPS();
	printf("FPS = %f\n", FPS);

	glEnable(GL_DEPTH_TEST);// 开启更新深度缓冲区的功能,被挡住的像素不绘制
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 清除颜色缓冲|深度缓冲

	glMatrixMode(GL_PROJECTION);// 设置当前矩阵模式:对投影矩阵应用随后的矩阵操作
	glLoadIdentity(); //将之前矩阵变换导致变化过的栈顶矩阵重新归位,置为单位矩阵,即之前的矩阵变换带来的影响到此为止
	gluPerspective(75, 1, 1, 400000);// 设置透视投影矩阵

	glMatrixMode(GL_MODELVIEW);// 设置当前矩阵模式:对模型视景矩阵堆栈应用随后的矩阵操作.
	glLoadIdentity();//将之前矩阵变换导致变化过的栈顶矩阵重新归位,置为单位矩阵,即之前的矩阵变换带来的影响到此为止
	gluLookAt(0, -200000, 200000, 0, 0, 0, 0, 0, 1);// 设置视点

	//sun
	glColor3f(1, 0, 0);// 设置绘制颜色为红色
	glutSolidSphere(69600, 20, 20);// 渲染一个球体

	// earth
	glColor3f(0, 0, 1);// 设置绘制颜色为蓝色
	glRotatef(day, 0, 0, -1);// 旋转
	glTranslatef(150000, 0, 0);// 平移
	glutSolidSphere(15945, 20, 20);// 渲染一个球体

	//moon
	glColor3f(1, 1, 0);
	glRotatef(day / 30.0 * 360 - day, 0, 0, -1);// 旋转
	glTranslatef(38000, 0, 0);// 平移
	glutSolidSphere(4345, 20, 20);// 渲染一个球体

	glFlush();// 清空缓冲区,立即执行绘制命令
	glutSwapBuffers();// 双缓冲时交换两个缓冲区指针
}

void idle()
{
	++day;
	if (day > 360){
		day = 0;
	}
	display();// 调用display方法进行强制刷新
}

int main(int argc, char **argv)
{
	glutInit(&argc, argv);// 初始化GLUT
	glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);// 显示显示模式(RGB颜色|双缓冲)
	glutCreateWindow("earth,moon,sun");// 设置窗口标题
	glutInitWindowSize(400, 400);// 设置窗口大小
	glutDisplayFunc(display);// 设置绘制函数
	glutIdleFunc(&idle);
	glutMainLoop();// 开启消息循环

	return 0;
}
时间: 2024-10-13 01:12:53

四 OpenGL中的变换的相关文章

opengl中场景变换|2D与3D互转换(转)

opengl中场景变换|2D与3D互转换 我们生活在一个三维的世界——如果要观察一个物体,我们可以: 1.从不同的位置去观察它.(视图变换) 2.移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它.(模型变换) 3.如果把物体画下来,我们可以选择:是否需要一种“近大远小”的透视效果.另外,我们可能只希望看到物体的一部分,而不是全部(剪裁).(投影变换) 4.我们可能希望把整个看到的图形画下来,但它只占据纸张的一部分,而不是全部.(视口变换) 这些,都可以在OpenGL中实

OpenGL中的空间变换

OpenGL中的空间变换 在使用OpenGL的三维虚拟程序中,当我们指定了模型的顶点之后,在屏幕上显示它们之前,一共会发生3种类型的变换:视图变换.模型变换.投影变换. 视图变换:指定观察者(摄像机)的位置: 模型变换:在场景中移动物体: 投影变换:改变可视区域的大小: 视口变换:这是一种伪变换,它对窗口上的最终输出进行缩放. 视觉坐标 它表示一种虚拟的固定坐标系统,通常作为一种参考系使用.它是根据观察者(摄像机)的角度而言的,与可能发生的变换无关.我们接下来所讨论的所有变换都是根据它们相对于视

[转载]矩阵及变换,以及矩阵在DirectX和OpenGL中的运用问题:左乘/右乘,行优先/列优先

[转载]http://www.xuebuyuan.com/882848.html (一)首先,无论dx还是opengl,所表示的矢量和矩阵都是依据线性代数中的标准定义的:“矩阵A与B的乘积矩阵C的第i行第j列的元素c(ij)等于A的第i行于B的第j列的对应元素乘积的和.”(实用数学手册,科学出版社,第二版)例如c12 = a11*b11+a12*b21+a12*b13... (二)在明确了这一点后,然后我们再看“矩阵的存储方式”,矩阵存储方式有两种,一种是“行主序(row-major order

(转)思考:矩阵及变换,以及矩阵在DirectX和OpenGL中的运用问题:左乘/右乘,行优先/列优先,...

转自:http://www.cnblogs.com/soroman/archive/2008/03/21/1115571.html 思考:矩阵及变换,以及矩阵在DirectX和OpenGL中的运用1.矩阵和线性变换:一一对应 矩阵是用来表示线性变换的一种工具,它和线性变换之间是一一对应的.考虑线性变换:a11*x1 + a12*x2 + ...+a1n*xn = x1'a21*x1 + a22*x2 + ...+a2n*xn = x2'...am1*x1 + am2*x2 + ...+amn*x

Assignment 4 OpenGL中正十二面体追踪球实现(平移、旋转、多面体线框体切换)

一.使用平台    windows  8.1     visual  studio  2012    二.使用方法     鼠标左键控制旋转,鼠标右键控制平移,点击鼠标中键出现菜单可选多面体 或线框体绘制.     键盘↑↓←→控制平移,F1 和 F2 键分别为多面体和线框体绘制的切换.  三.实现简述     主函数  在 main 函数中与这次实验相关的主要有以下几个函数:  glutReshapeFunc(myReshape);  //窗口改变时重新设

OpenGL中shader使用

引自:http://blog.csdn.net/wl_soft50/article/details/7916720 http://blog.sina.com.cn/s/blog_923fdd9b0102vbe0.html 与OpenGL ES1.x渲染管线相比,OpenGL ES 2.0渲染管线中“顶点着色器”取代了OpenGL ES 1.x渲染管线中的“变换和光照”:“片元着色器”取代了OpenGL ES 1.x渲染管线中的“纹理环境和颜色求和”.“雾”以及“Alpha测试”. 这使得开发人员

OpenGL中各种坐标系的理解[转]

OPENGL坐标系可分为:世界坐标系和当前绘图坐标系. 世界坐标系:在OpenGL中,世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的.你面对 屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴.长度单位这样来定: 窗口范围按此单位恰好是(-1,-1)到(1,1),即屏幕左下角坐标为(-1,-1),右上角 坐标为(1,1). 当前绘图坐标系:是绘制物体时的坐标系.程序刚初始化时,世界坐标系和当前绘图坐标系是重合 的.当用glTranslatef(),glScalef(),

什么是OpenGL中的深度、深度缓存、深度测试?

原文来自http://blog.csdn.net/xiaoquanhuang/article/details/6613705 1)直观理解 深度其实就是该象素点在3d世界中距离摄象机的距离,深度缓存中存储着每个象素点(绘制在屏幕上的)的深度值!深度测试决定了是否绘制较远的象素点(或较近的象素点),通常选用较近的,而较远优先能实现透视的效果!!! 2)Z值(深度值).Z buffer(深度缓存) 下面先讲讲Z坐标.Z坐标和X.Y坐标一样.在变换.裁减和透视除法后,Z的范围为-1.0~1.0.Dep

OpenGL中的颜色混合功能(一)

我们知道,材料属性和光照参数可以极大地增加图形的逼真度,但除此之外,我们在对现实世界进行建模时,有许多效果是通过混合颜色的方式实现的.透明的物体,像是玻璃水杯,在它后面发射过来的光会与透明物体的颜色混合在一起.这种透明在OpenGL中的实现方式,是通过首先绘制背景物体,然后把前景物体(比如水杯)与颜色缓冲区中已经存在的颜色进行混合而实现的.在这一过程中,颜色的alpha值成分发挥了重要作用. 颜色的混合功能 在一般情况下,OpenGL在渲染时把颜色值存放在颜色缓冲区中,把每个片段(像素)的深度值