opengl(六)
来源:互联网 发布:当代文学论文选题知乎 编辑:程序博客网 时间:2024/05/21 06:32
今天来讲三维变换
1、从不同的位置去观察它。(视图变换)
2、移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它。(模型变换)
3、如果把物体画下来,我们可以选择:是否需要一种“近大远小”的透视效果。另外,我们可能只希望看到物体的一部分,而不是全部(剪裁)。(投影变换)
4、我们可能希望把整个看到的图形画下来,但它只占据纸张的一部分,而不是全部。(视口变换)
这些就是我们基本的对于一个三维的物体我们的观察方法。opengl提供了一些方法来让我们实现这些。
(一)
模型变换:这个来说就是对于一个三维物体本身进行变换,有三种:
glTranslate*,把当前矩阵和一个表示移动物体的矩阵相乘。三个参数分别表示了在三个坐标上的位移值。
glRotate*,把当前矩阵和一个表示旋转物体的矩阵相乘。物体将绕着(0,0,0)到(x,y,z)的直线以逆时针旋转,参数angle表示旋转的角度。
glScale*,把当前矩阵和一个表示缩放物体的矩阵相乘。x,y,z分别表示在该方向上的缩放比例。
这里补充一下opengl的坐标系的观点:世界坐标系就是按照屏幕中心原点来判别的,左到右x的往正方面,下到上y的往正方面,屏幕内部到屏幕外部是z往正方向。当你进行移动变换以后,那么接下来的绘图不会按照世界坐标系了,会按照物体的坐标系来画。
#include <GL/glut.h>void display(){glMatrixMode(GL_MODELVIEW);//使用模型矩阵glLoadIdentity();//消除之前矩阵的影响glTranslatef(0.0f, -1.0f, 0.0f);glutSolidSphere(1, 80, 16);glFlush();}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowPosition(150, 150);glutInitWindowSize(400, 400);glutCreateWindow("透视投影变换");//init();glutDisplayFunc(display);glutMainLoop();return 0;}
为止在这里那么接下来我在画一个矩形
#include <GL/glut.h>void display(){glMatrixMode(GL_MODELVIEW);//使用模型矩阵glLoadIdentity();//消除之前矩阵的影响glTranslatef(0.0f, -1.0f, 0.0f);glutSolidSphere(1, 80, 16);glRectf(-1.0, -1.0, 1.0, 1.0);glFlush();}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowPosition(150, 150);glutInitWindowSize(400, 400);glutCreateWindow("透视投影变换");//init();glutDisplayFunc(display);glutMainLoop();return 0;}
效果就会是这样:
矩阵并没有出现在中心,而是在下面说明是按照物体的坐标系画的。
(二)视图变换
说白了就是你眼睛的位置在哪里。
使用gluLookAt(),来设置你的眼睛的位置。
参数的信息是这样的:
第一组eyex, eyey,eyez 相机在世界坐标的位置
第二组centerx,centery,centerz 相机镜头对准的物体在世界坐标的位置
第三组upx,upy,upz 相机向上的方向在世界坐标中的方向
你把相机想象成为你自己的脑袋:
第一组数据就是脑袋的位置
第二组数据就是眼睛看的物体的位置
第三组就是头顶朝向的方向(因为你可以歪着头看同一个物体)。
(三)投影变换
这个的意思就是把三维的物体怎么画到平面上去,有两种投影的方法:透视投影和正投影。
透视投影使用的是gluPerspective()函数,这个在我的opengl1中我很详细的介绍过这个函数可以去看看。
效果图是这样的:
(网上有很多这个图只是比较形象)。
还有一个是正投影,使用的是void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);
参数的意思大概是这样的:
glOrtho就是一个正射投影函数。它创建一个平行视景体。实际上这个函数的操作是创建一个正射投影矩阵,并且用这个矩阵乘以当前矩阵。其中近裁剪平面是一个矩形,矩形左下角点三维空间坐标是(left,bottom,-near),右上角点是(right,top,-near);远裁剪平面也是一个矩形,左下角点空间坐标是(left,bottom,-far),右上角点是(right,top,-far)。所有的near和far值同时为正或同时为负。如果没有其他变换,正射投影的方向平行于Z轴,且视点朝向Z负轴。这意味着物体在视点前面时far和near都为负值,物体在视点后面时far和near都为正值。
效果就是这么一张平面图.
(四)视口变换
说白了就是你的二维图片的大小,使用
这个的类型会根据离它最近的
glPopMatrix(); //将栈顶的矩阵推出。
(三)投影变换
这个的意思就是把三维的物体怎么画到平面上去,有两种投影的方法:透视投影和正投影。
透视投影使用的是gluPerspective()函数,这个在我的opengl1中我很详细的介绍过这个函数可以去看看。
效果图是这样的:
(网上有很多这个图只是比较形象)。
还有一个是正投影,使用的是void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);
参数的意思大概是这样的:
glOrtho就是一个正射投影函数。它创建一个平行视景体。实际上这个函数的操作是创建一个正射投影矩阵,并且用这个矩阵乘以当前矩阵。其中近裁剪平面是一个矩形,矩形左下角点三维空间坐标是(left,bottom,-near),右上角点是(right,top,-near);远裁剪平面也是一个矩形,左下角点空间坐标是(left,bottom,-far),右上角点是(right,top,-far)。所有的near和far值同时为正或同时为负。如果没有其他变换,正射投影的方向平行于Z轴,且视点朝向Z负轴。这意味着物体在视点前面时far和near都为负值,物体在视点后面时far和near都为正值。
效果就是这么一张平面图.
(四)视口变换
说白了就是你的二维图片的大小,使用
glViewport(GLint x,GLint y,GLsizei width,GLsizei height)为其函数原型。
X,Y————以像素为单位,指定了视口的左下角(在第一象限内,以(0,0)为原点的)位置。
width,height————表示这个视口矩形的宽度和高度,根据窗口的实时变化重绘窗口。
(五)矩阵堆栈
介于是入门教程,先简单介绍一下堆栈。你可以把堆栈想象成一叠盘子。开始的时候一个盘子也没有,你可以一个一个往上放,也可以一个一个取下来。每次取下的,都是最后一次被放上去的盘子。通常,在计算机实现堆栈时,堆栈的容量是有限的,如果盘子过多,就会出错。当然,如果没有盘子了,再要求取一个盘子,也会出错。(引用一下别人的话)。(五)矩阵堆栈
这个的类型会根据离它最近的
glMatrixMode调用的参数类型来决定的。目的就是保存当前的矩阵(也就是当前的图像)。想要的时候在拿出来。使用glPushMatrix(); //将当前变换矩阵(单位阵)压入堆栈
glPopMatrix(); //将栈顶的矩阵推出。
1 0
- opengl(六)
- NeHe OpenGL教程 (六)
- OpenGL入门学习(六)
- OpenGL入门笔记(六)
- OpenGL入门学习(六)
- Android图形---OpenGL(六)
- OpenGL入门学习(六)
- OpenGL入门学习(六)
- OpenGL学习(六)锯齿
- OpenGL入门学习(六)
- OPENGL学习笔记(六)
- OpenGL学习总结(六)
- OpenGL学习笔记(六)
- OpenGL ES总结(六)OpenGL ES中EGL
- OpenGL入门学习(六) 【转】
- 学习OpenGL(六)光栅图形
- OpenGL之路(六)贴图
- OpenGL学习笔记(六)
- Nginx服务器部署SSL证书手机不信任解决方法
- Makefile 中:= ?= += =的区别
- HDOJ{A}+{B}
- 疯狂XML学习笔记(11)-----------XSLT讲解
- echarts初始化
- opengl(六)
- 贪心算法基础(一)——数列极差
- 如何加快C++代码的编译速度
- html页面上含有<>,括号中是英文的页面上不显示
- 引导Ubuntu
- 内存对齐方式的总结 如何计算结构体所占内存的大小
- malloc与calloc,realloc动态内存的用法
- 一个EXTJS与JSP连接把数据写入数据库的例子
- WebView显示320*50的广告不能铺满网页宽,使用ViewPoint适配