正投影:将物体直接投影到屏幕上,不改变其大小
glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);透视投影:远处的东西看起来要小一些,近处的东西看起来会大一些,这就是透视原理
gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar)
首先得设置gluPerspective,来看看它的参数都表示什么意思
fovy,这个最难理解,我的理解是,眼睛睁开的角度,即,视角的大小,如果设置为0,相当你闭上眼睛了,所以什么也看不到,如果为180,那么可以认为你的视界很广阔,
aspect,这个好理解,就是实际窗口的纵横比,即x/y
zNear,这个呢,表示你近处剪裁面
zFar表示远处剪裁面
glViewport(0,0,600,480); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f,(GLfloat)600/(GLfloat)480,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); 窗口的大小是800*600 视口的大小是600*480,可以看出视口是以窗口的左下角为原点的一个区域 glTranslatef(0.0f,0.0f,-3.0f); glBindTexture(GL_TEXTURE_2D, texture[0]); glColor3f(1.0f,1.0f,0.0f);//黄色图形 glBegin(GL_QUADS) glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f,0.0f,0.0f); glTexCoord2f(1.0f,0.0f); glVertex3f(1.0f, 0.0f,0.0f); glTexCoord2f(1.0f,1.0f);glVertex3f(1.0f, 1.0f, 0.0f); glTexCoord2f(0.0f,1.0f);glVertex3f(0.0f, 1.0f, 0.0f); glEnd(); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity() glOrtho(0,800,0,600,-1,1); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity() glColor3f(0.0f,1.0f,0.0f);//绿色图形 glBegin(GL_QUADS) glTexCoord2f(0.0f, 0.0f); glVertex3i(10, 30, 0); glTexCoord2f(1.0f,0.0f); glVertex3i(110, 30, 0); glTexCoord2f(1.0f,1.0f);glVertex3i(110, 130, 0); glTexCoord2f(0.0f,1.0f);glVertex3i(10, 130, 0); glEnd(); glMatrixMode(GL_PROJECTION); glPopMatrix() glMatrixMode(GL_MODELVIEW); glPopMatrix(); 建立right=800,top=600的正投影。可以看到正投影以左下角为原点(虽然视口是600*400,此处会按照比例进行缩放) glMatrixMode(GL_PROJECTION) glPushMatrix(); glLoadIdentity(); glOrtho(0,800,600,0,-1,1); glMatrixMode(GL_MODELVIEW); glPushMatrix() glLoadIdentity(); glScaled(2,2,2); glColor3f(1.0f,0.0f,0.0f);//红色图形 glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f);glVertex3i(10, 30, 0); glTexCoord2f(1.0f,0.0f);glVertex3i(110, 30, 0); glTexCoord2f(1.0f,1.0f);glVertex3i(110, 130, 0); glTexCoord2f(0.0f,1.0f);glVertex3i(10, 130, 0); glEnd(); glMatrixMode(GL_PROJECTION) glPopMatrix(); glMatrixMode(GL_MODELVIEW) glPopMatrix()
建立right=800,bottom=600的正投影。可以看到正投影以左上角为原点(虽然视口是600*400,此处会按照比例进行缩放)glScaled可以对正投影进行缩放,glTranslatef可对透视投影进行缩放
建立left=800,bottom=600的正投影。可以看到正投影以右上角为原点
建立left=800,top=600的正投影。可以看到正投影以右上角为原点
正投影是以原比例进行显示不会随着Z轴的变化而变化
视口:viewport当我们投影完成以后投影内容会按照视口的比例进行拉伸和缩放
举例:视口的大小是800*600 假设我们正投影设置为 width 8 height 6 那么显示出来的效果就是物体宽高都拉伸100倍
glViewport(0,0,800,600);
glOrtho(0,200,0,150,-1,1);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(0, 0, 0);
glTexCoord2f(1.0f,0.0f); glVertex3f(100, 0, 0);
glTexCoord2f(1.0f,1.0f);glVertex3f(100, 100, 0);
glTexCoord2f(0.0f,1.0f);glVertex3f(0, 100, 0);
glEnd()
分析:可知四边形宽度和高度都是100,乘以系数 分别为weight(100*800/200),height(100*600/150)
#include "header.h" GLuint texture[3]; AUX_RGBImageRec *LoadBMP(char *Filename) { FILE *File=NULL; if (!Filename) { return NULL; } File=fopen(Filename,"r"); if (File) { fclose(File); return auxDIBImageLoad(Filename); } return NULL; } int LoadGLTextures() { int Status=FALSE; AUX_RGBImageRec *TextureImage[3]; memset(TextureImage,0,sizeof(void *)*3); if ((TextureImage[0]=LoadBMP("Data/logo.bmp") )&& (TextureImage[1]=LoadBMP("Data/mask1.bmp"))&& (TextureImage[2]=LoadBMP("Data/image1.bmp"))) { Status=TRUE; glGenTextures(3, &texture[0]); glBindTexture(GL_TEXTURE_2D, texture[0]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); glBindTexture(GL_TEXTURE_2D, texture[1]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TextureImage[1]->sizeX, TextureImage[1]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[1]->data); glBindTexture(GL_TEXTURE_2D, texture[2]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TextureImage[2]->sizeX, TextureImage[2]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[2]->data); } if (TextureImage[0]) { if (TextureImage[0]->data) { free(TextureImage[0]->data); } free(TextureImage[0]); } return Status; } GLvoid ReSizeGLScene(GLsizei width, GLsizei height) { if (height==0) { height=1; } glViewport(0,0,600,480); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(90.0f,(GLfloat)600/(GLfloat)480,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } int InitGL(GLvoid) { if (!LoadGLTextures()) { return FALSE; } glClearColor(1.0f, 1.0f, 1.0f, 0.0f); glClearDepth(1.0); glEnable(GL_DEPTH_TEST); // glShadeModel(GL_SMOOTH); glEnable(GL_TEXTURE_2D); return TRUE; } void DrawGLScene(GLvoid) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f,0.0f,-3.0f); glBindTexture(GL_TEXTURE_2D, texture[0]); glColor3f(1.0f,1.0f,0.0f); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f,0.0f,0.0f); glTexCoord2f(1.0f,0.0f); glVertex3f(1.0f, 0.0f,0.0f); glTexCoord2f(1.0f,1.0f);glVertex3f(1.0f, 1.0f, 0.0f); glTexCoord2f(0.0f,1.0f);glVertex3f(0.0f, 1.0f, 0.0f); glEnd(); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(0,800,0,600,-1,1); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glColor3f(0.0f,1.0f,0.0f); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex3i(10, 30, 0); glTexCoord2f(1.0f,0.0f); glVertex3i(110, 30, 0); glTexCoord2f(1.0f,1.0f);glVertex3i(110, 130, 0); glTexCoord2f(0.0f,1.0f);glVertex3i(10, 130, 0); glEnd(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(0,800,600,0,-1,1); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glScaled(2,2,2); glColor3f(1.0f,0.0f,0.0f); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f);glVertex3i(10, 30, 0); glTexCoord2f(1.0f,0.0f);glVertex3i(110, 30, 0); glTexCoord2f(1.0f,1.0f);glVertex3i(110, 130, 0); glTexCoord2f(0.0f,1.0f);glVertex3i(10, 130, 0); glEnd(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(800,0,600,0,-1,1); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glColor3f(0.8f,0.5f,0.0f); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f);glVertex3i(10, 30, 0); glTexCoord2f(1.0f,0.0f);glVertex3i(110, 30, 0); glTexCoord2f(1.0f,1.0f);glVertex3i(110, 130, 0); glTexCoord2f(0.0f,1.0f);glVertex3i(10, 130, 0); glEnd(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(800,0,0,600,-1,1); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glColor3f(0.3f,0.5f,1.0f); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f);glVertex3i(10, 30, 0); glTexCoord2f(1.0f,0.0f);glVertex3i(110, 30, 0); glTexCoord2f(1.0f,1.0f);glVertex3i(110, 130, 0); glTexCoord2f(0.0f,1.0f);glVertex3i(10, 130, 0); glEnd(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); glFlush(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(640,480); glutCreateWindow("视口,正投影,透视投影"); glutReshapeFunc(ReSizeGLScene); glutDisplayFunc(DrawGLScene); InitGL(); glutMainLoop(); return 0; }
相关推荐
实现opengl多视口显示模型 窗口分割
opengl中模型变换,投影变换,视点变换,视口变换比较让人头晕,看个这个演示就会有清楚的认识啦 http://www.99pan.com/Invite?uid=171324
多视口OpenGL程序,将单文档的窗口分成左右两个部分,使其独立渲染图形。
OpenGL教程第42课多重视口.rar
本书共12张,第一章:OpenGL概述,第二章:着色器基础,第三章:OpenGL绘制方式,第四章:颜色、像素和帧缓存,第五章:视口变换、剪切与反馈,第六章:纹理,第七章:光照与阴影,第八章:程序式纹理,第九章:细分...
小实验3:正平行投影1 19 小实验4:正平行投影2 19 小实验5:正平行投影3 20 小实验6:透射投影1 21 小实验6:透射投影2 22 小实验7:三维对象 24 实验四 光照模型和纹理映射 26 小实验1:光照模型1----OpenGL简单...
视口单位视口单元现场测试
Void glViewport(Glint x,Glint y,GLsizei width,Glsizei height); 在窗口中定义一个像素矩形,最终的图形将映射到个矩形中。(x,y)参数指定了视口的左下角,width和height表示这个视口矩形的宽度和高度。
您是否需要在元素每次进入视口时触发动画? 好吧,这是我们的插件开箱即用的。 此外,您将能够设置动画的延迟,偏移,想要动画的次数以及动画的持续时间。 所有这些都通过数据属性! Tadaam是一个轻量级,结构良好...
nd-slider 实现网页的全屏切换效果,多用于产品官网等展示型的网站。 安装 $ spm install nd-slider --save 使用 var slider = require('nd-slider'); new Slider({ paginator: '#paginator', ...
首先,添加以下元视口: < meta name =" viewport " content =" width=device-width,initial-scale=1.0 " > 然后,初始化视口: var viewport = require ( 'viewport' ) ; 现在,开始使用它! viewport ....
PyQt(Python+Qt)学习随笔:QAbstractScrollArea的viewPort(视口)理解.rar
all :如果元素的任何部分在视口中inner :整个元素必须在视口内top :位于视口顶部的任何元素bottom :位于视口底部的任何元素####offset 类型: Integer默认值: 0 按像素量偏移视口。 方便在图像进入屏幕之前...
在一个视口中拖动和缩放图像时,所有其他视口将以相同的方式同步缩放和移动,因此您在所有图像中看到的都是完全相同的面片。 产品特点 使用Mip映射数据结构的OpenGL加速查看器 在一个视口中拖动和缩放时同步多个...
OpenGL教程NeHe源代码,教程源代码。 NeHe教程是学习OpenGL的经典网址: http://nehe.gamedev.net/
OpenGL-查看器简单的场景实现,使用 glut 来创建一个带有一些四处移动的原始对象的视口。 您可以通过按以下键移动“相机”: BckSp:在平移和旋转模式之间切换。 P :在预投影和正交投影之间切换。 W:平移/向上旋转...
LinkedInJavaScript视口跟踪库和 polyfill。 跟踪用户实际看到的内容。 import { IntersectionObserver } from 'spaniel' ; new IntersectionObserver ( ( entries ) => { console . log ( 'I see you' ) } , { ...
投影矩阵、视口矩阵推导过程
opengl教程 一个基于PyOpenGL的Python opengl-tutorial。 所有内容均遵循 您还可以在这里找到C实现: : 表中的内容 tu_00_glfw_window_sample:GLFW版本彩色立方体。 原始教程=> tu_01_color_cube:GLUT版本彩色...