正投影:将物体直接投影到屏幕上,不改变其大小
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并不直接提供“透视平行投影”的函数,而是分别提供了`gluPerspective()`函数用于设置透视投影,以及`glOrtho()`函数用于设置平行投影。 1. **透视投影**:`gluPerspective()`函数参数包括视角角度(field of...
这与透视投影不同,透视投影会模拟人眼看到的真实世界效果,使远离观察者的物体看起来更小。 在OpenGL中,绘制单位立方体通常涉及到设置顶点坐标,这些坐标定义了立方体的六个面。单位立方体的每个面都是一个正方形...
在MFC(Microsoft Foundation Classes)框架下实现透视投影,通常涉及到OpenGL或者Direct3D等图形库。本篇将详细讲解一点透视、两点透视和三点透视的概念以及在MFC中如何实现。 首先,我们来理解一下三种透视投影的...
- **视口和投影**: 视口决定了图形在屏幕上的大小和位置,投影则处理空间转换,如正交投影和透视投影。 3. **变换与矩阵** - **平移、旋转和缩放**: 通过矩阵运算实现物体在3D空间中的位置变化。 - **矩阵堆栈*...
OpenGL提供了两种主要的投影方式:正交投影和透视投影,分别适用于不同场景,如界面设计和真实感渲染。 3. **顶点着色和光栅化**:顶点着色是为每个顶点设置颜色或属性的过程,然后通过光栅化将3D几何体转化为屏幕...
5. **视口和投影**:视口定义了屏幕上的渲染区域,而投影则决定了三维空间中的对象如何映射到二维视口上,常见的投影有正交投影和透视投影。 6. **顶点和图元**:OpenGL的基本构建块是顶点,它们可以组合成图元(点...
OpenGL提供了几种投影模式,如透视投影(模拟人眼看到的真实世界效果)和平行投影(常用于制作布局或工程图纸)。 3. **模型视图变换**:用于改变物体在3D空间中的位置和方向。这通常涉及平移、旋转和缩放矩阵的...
OpenGL支持两种类型的投影变换:透视投影和正投影。 ##### 设置投影矩阵 ```c++ glMatrixMode(GL_PROJECTION); glLoadIdentity(); ``` **透视投影**产生的结果类似于现实世界中的视觉效果,即近大远小。可以通过`...
常见的投影类型有透视投影和正交投影,前者模拟人眼的视角,后者用于创建二维效果。 8. **状态机模型**:OpenGL使用状态机模型,许多设置如颜色、深度测试、混合模式等一旦设定,就会一直保持,直到被新的设置覆盖...
3. 透视投影:应用透视变换,使得远离观察者的物体看起来更小,模拟真实世界的视觉效果。 4. 模型视图矩阵:组合模型、视图和投影矩阵,对顶点进行空间变换,确定它们在屏幕上的位置。 逆时针旋转是通过更新模型...
**平行投影**,也称为正投影,是当光源与投影平面平行时产生的投影。在这种情况下,所有物体线段的投影长度与其实际长度成比例,保持平行性,不会因距离观察者远近而发生变形。在编程实现时,我们通常会设定一个投影...
4. **投影和视口变换(Projection and Viewport Transformations)**:将3D空间中的物体转换为2D屏幕上的像素,通常包括正交投影和透视投影两种方式。 5. **颜色设置(Colors)**:通过glColor函数指定顶点或片段的...
OpenGL使用右手坐标系,其中X轴正向右,Y轴正向上,Z轴正向前(通常称为视口空间或屏幕空间)。相机的位置和方向在世界空间中定义,而我们看到的场景是通过相机的视口和投影变换来呈现的。 1. **视图矩阵(View ...
5. **视口与投影变换**:视口转换将3D空间的坐标映射到2D窗口上,而投影变换则负责模拟不同的视角,如透视和正交投影。 6. **模型视图矩阵**:用于移动、旋转和缩放对象。理解如何使用`glTranslate`、`glRotate`和`...
为了将3D对象显示在2D屏幕上,我们需要进行投影变换,可以使用正交投影或透视投影,这里可能使用了正交投影来简化三视图的绘制。 2. **模型构建**:纸飞机的3D模型需要通过顶点数据定义,这通常涉及到三角形网格的...
透视投影模拟人眼对远近物体的大小感知,而正交投影则在所有方向上保持比例,常用于2D制图或界面设计。 6. **归一化设备坐标系(NDC)** - 投影坐标经过进一步变换后,会进入归一化设备坐标系。在这个坐标系中,所有...
OpenGL提供了两种投影类型:透视投影和正投影。透视投影模拟真实世界的视觉效果,产生近大远小的深度感,常用于游戏和视觉效果。它通过`glFrustum`函数设置,定义了一个带有消失点的近似圆锥形的可视空间。而正投影...
2. **投影变换**:在处理3D图形时,我们需要将三维坐标投影到二维视口上,这通常通过透视投影或正交投影完成。透视投影模拟人眼观察物体的效果,物体远离观察者时会显得更小;正交投影则提供一种等距的观察方式,...
在定义投影方式时,OpenGL提供了正投影和透视投影两种方式。正投影保持物体大小不变,常用于CAD应用,而透视投影则模仿人类视觉,使近处物体显得较大,远处物体较小,适用于创建具有深度感的场景。通过`glOrtho`或`...
视口将OpenGL的设备坐标转换为窗口坐标,而投影矩阵则用于将3D空间中的点转换到2D视口上,常见的投影方式有透视投影和平行投影。 3. **绘制球体**: 要绘制球体,可以使用球面坐标系统,将球体上的每个点映射到...