glViewport和glOrtho的理解-OpenGL

上传人:宝路 文档编号:23261631 上传时间:2017-11-30 格式:DOCX 页数:5 大小:17.81KB
返回 下载 相关 举报
glViewport和glOrtho的理解-OpenGL_第1页
第1页 / 共5页
glViewport和glOrtho的理解-OpenGL_第2页
第2页 / 共5页
glViewport和glOrtho的理解-OpenGL_第3页
第3页 / 共5页
glViewport和glOrtho的理解-OpenGL_第4页
第4页 / 共5页
glViewport和glOrtho的理解-OpenGL_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《glViewport和glOrtho的理解-OpenGL》由会员分享,可在线阅读,更多相关《glViewport和glOrtho的理解-OpenGL(5页珍藏版)》请在金锄头文库上搜索。

1、glViewport()和 glOrtho()的理解-OpenGL 在 OpenGL中有两个比较重要的投影变换函数,glViewport 和 glOrtho.ortho实际上是orthographic projection正交投影的缩写。glViewport是视口变换它是设置视口,它设置的视口的左下角,以及宽度和高度。glOrtho是窗口变换,设置的是世界窗口俗称窗口。二维绘图来说世界窗口由gluOrth2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top)设定。三维绘图的世界窗口由 glOrtho(left, righ

2、t, bottom, top, near, far)设定。glOrtho是创建一个正交平行的视景体。一般用于物体不会因为离屏幕的远近而产生大小的变换的情况。比如,常用的工程中的制图等。需要比较精确的显示。 而作为它的对立情况, glFrustum 则产生一个透视投影。这是一种模拟真是生活中,人们视野观测物体的真实情况。例如:观察两条平行的火车到,在过了很远之后,这两条铁轨是会相交于一处的。还有,离眼睛近的物体看起来大一些,远的物体看起来小一些。glOrtho(left, right, bottom, top, near, far), left 表示视景体左面的坐标,right表示右面的坐标,b

3、ottom 表示下面的,top 表示上面的。这个函数简单理解起来,就是一个物体摆在那里,你怎么去截取他。这里,我们先抛开 glViewport函数不看。先单独理解glOrtho的功能。 假设有一个球体,半径为 1,圆心在(0, 0, 0),那么,我们设定glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 10);就表示用一个宽高都是 3的框框把这个球体整个都装了进来。 如果设定 glOrtho(0.0, 1.5, -1.5, 1.5, -10, 10);就表示用一个宽是1.5, 高是 3的框框把整个球体的右面装进来;如果设定 glOrtho(0.0, 1.5, 0.0, 1.

4、5, -10, 10);就表示用一个宽和高都是 1.5的框框把球体的右上角装了进来。从上述三种情况,我们可以大致了解 glOrtho 函数的用法。-glViewport(): /设置视口glOrtho 函数只是负责使用什么样的视景体来截取图像,并不负责使用某种规则把图像呈现在屏幕上。glViewport 主要完成这样的功能。它负责把视景体截取的图像按照怎样的高和宽显示到屏幕上。比如:如果我们使用 glut 库建立一个窗体:glutInitWindowSize(500, 500); 然后使用glutReshapeFunc(reshape); reshape 代码如下:void reshape(i

5、nt width, int height)glViewport(0, 0, (GLsizei)width, (GLsizei)height);glMatrixModel(GL_PROJECTION);glLoadIdentity();glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 10);.这样是可以看到一个正常的球体的。但是,如果我们创建窗体时 glutInitWindowSize(800, 500),那么看到的图像就是变形的。因为我们是用一个正方形截面的视景体截取的图像,但是拉伸到屏幕上显示的时候,就变成了 glViewport(0, 0, 800, 500);也就是

6、显示屏变宽了,倒是显示的时候把一个正方形的图像“活生生的给拉宽了”。就会产生变形。这样,就需要我们调整我们的 OpenGL 显示屏了。我们可以不用 800 那么宽,因为我们是用的正方形的视景体,所以虽然窗体是 800 宽,但是我们只用其中的 500 就够了。修改一下程序。void reshape(int width, int height)int dis = width #include #include void init(void)GLfloat mat_specular = 1.0, 1.0, 1.0, 1.0;GLfloat mat_shininess = 50.0;GLfloat l

7、ight_position = 1.0, 1.0f, 1.0, 0.0;GLfloat white_light = 1.0, 1.0, 1.0, 1.0;GLfloat lmodel_ambient = 0.1, 0.1, 0.1, 1.0;glClearColor(0.0, 0.0, 0.0, 0.0);glShadeModel(GL_SMOOTH);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);glLightfv(GL_LIGHT0,

8、 GL_POSITION, light_position);glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light);glLightfv(GL_LIGHT0, GL_SPECULAR, white_light);glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_DEPTH_TEST);void display(void)glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH

9、_BUFFER_BIT);glutSolidSphere(1.0, 20, 16);glFlush();void reshape(int w, int h)glViewport(0, 0, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w = h)glOrtho(-1.5, 1.5, -1.5 * (GLfloat)h/(GLfloat)w, 1.5 * (GLfloat)h/(GLfloat)w, -10.0, 10.0);elseglOrtho(-1.5*(GLfloat)w/(GLfloa

10、t)h, 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();int main(int argc, char *argv)glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(500, 500);glutInitWindowPosition(100, 100);glutCreateWindow(argv0);init(

11、);glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();return 0;/*CMakeLists.txt*/PROJECT(s5)CMAKE_MINIMUM_REQUIRED(VERSION 2.6)ADD_EXECUTABLE(s5 main.cpp)FIND_PACKAGE(OpenGL)FIND_PACKAGE(GLUT)IF(OPENGL_FOUND)INCLUDE_DIRECTORIES($OPENGL_INCLUDE_DIR)TARGET_LINK_LIBRARIES($PROJECT_NAME $OP

12、ENGL_LIBRARIES)ELSE(OPENGL_FOUND)MESSAGE(FATAL_ERROR OpenGL not found)ENDIF(OPENGL_FOUND)IF(GLUT_FOUND)INCLUDE_DIRECTORIES($GLUT_INCLUDE_DIR)TARGET_LINK_LIBRARIES($PROJECT_NAME $GLUT_LIBRARIES)ELSE(GLUT_FOUND)ENDIF(GLUT_FOUND)参考: OpenGL 编程指南(原书第 6 版)PS:用 glOrtho 裁剪之后,可以把要显示的这个面(毕竟在电脑上显示出来的是二维的面,只是我们具有立体空间想象力)当成一块可以拉伸也可以压缩的布,根据 glViewport 的宽和高把这块布拉伸或者压缩成相应大小,这样一想裁剪(取视景体)的宽高比例如果和glViewport 比例不同的话,那肯定就走形了。这样会好理解多吧。_

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号