`
tiankefeng0520
  • 浏览: 145689 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

OpenGL学习十:视口,正投影,透视投影

阅读更多

正投影:将物体直接投影到屏幕上,不改变其大小
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;
}

 

  • 大小: 14.5 KB
  • 大小: 14 KB
分享到:
评论

相关推荐

    透视平行投影_透视平行投影_

    OpenGL并不直接提供“透视平行投影”的函数,而是分别提供了`gluPerspective()`函数用于设置透视投影,以及`glOrtho()`函数用于设置平行投影。 1. **透视投影**:`gluPerspective()`函数参数包括视角角度(field of...

    opengl绘制一个单位立方体正平行投影图的程序

    这与透视投影不同,透视投影会模拟人眼看到的真实世界效果,使远离观察者的物体看起来更小。 在OpenGL中,绘制单位立方体通常涉及到设置顶点坐标,这些坐标定义了立方体的六个面。单位立方体的每个面都是一个正方形...

    MFC透视投影

    在MFC(Microsoft Foundation Classes)框架下实现透视投影,通常涉及到OpenGL或者Direct3D等图形库。本篇将详细讲解一点透视、两点透视和三点透视的概念以及在MFC中如何实现。 首先,我们来理解一下三种透视投影的...

    opengles 入门资料

    - **视口和投影**: 视口决定了图形在屏幕上的大小和位置,投影则处理空间转换,如正交投影和透视投影。 3. **变换与矩阵** - **平移、旋转和缩放**: 通过矩阵运算实现物体在3D空间中的位置变化。 - **矩阵堆栈*...

    opengl实现的 图形学主要算法

    OpenGL提供了两种主要的投影方式:正交投影和透视投影,分别适用于不同场景,如界面设计和真实感渲染。 3. **顶点着色和光栅化**:顶点着色是为每个顶点设置颜色或属性的过程,然后通过光栅化将3D几何体转化为屏幕...

    OpenGL.zip_C#OPENGL_c# opengl_opengl_visual c

    5. **视口和投影**:视口定义了屏幕上的渲染区域,而投影则决定了三维空间中的对象如何映射到二维视口上,常见的投影有正交投影和透视投影。 6. **顶点和图元**:OpenGL的基本构建块是顶点,它们可以组合成图元(点...

    用于3D显示opengl

    OpenGL提供了几种投影模式,如透视投影(模拟人眼看到的真实世界效果)和平行投影(常用于制作布局或工程图纸)。 3. **模型视图变换**:用于改变物体在3D空间中的位置和方向。这通常涉及平移、旋转和缩放矩阵的...

    OpenGL入门学习之五——三维的空间变换.pdf

    OpenGL支持两种类型的投影变换:透视投影和正投影。 ##### 设置投影矩阵 ```c++ glMatrixMode(GL_PROJECTION); glLoadIdentity(); ``` **透视投影**产生的结果类似于现实世界中的视觉效果,即近大远小。可以通过`...

    虚拟三维场景(opengl编程实例)

    常见的投影类型有透视投影和正交投影,前者模拟人眼的视角,后者用于创建二维效果。 8. **状态机模型**:OpenGL使用状态机模型,许多设置如颜色、深度测试、混合模式等一旦设定,就会一直保持,直到被新的设置覆盖...

    OpenGL.rar_opengl colorcube_opengl简单

    3. 透视投影:应用透视变换,使得远离观察者的物体看起来更小,模拟真实世界的视觉效果。 4. 模型视图矩阵:组合模型、视图和投影矩阵,对顶点进行空间变换,确定它们在屏幕上的位置。 逆时针旋转是通过更新模型...

    二维图形的投影变换

    **平行投影**,也称为正投影,是当光源与投影平面平行时产生的投影。在这种情况下,所有物体线段的投影长度与其实际长度成比例,保持平行性,不会因距离观察者远近而发生变形。在编程实现时,我们通常会设定一个投影...

    opengl 画图程序

    4. **投影和视口变换(Projection and Viewport Transformations)**:将3D空间中的物体转换为2D屏幕上的像素,通常包括正交投影和透视投影两种方式。 5. **颜色设置(Colors)**:通过glColor函数指定顶点或片段的...

    OpenGL.zip_OpenGL camera

    OpenGL使用右手坐标系,其中X轴正向右,Y轴正向上,Z轴正向前(通常称为视口空间或屏幕空间)。相机的位置和方向在世界空间中定义,而我们看到的场景是通过相机的视口和投影变换来呈现的。 1. **视图矩阵(View ...

    nehe opengl教程源代码2

    5. **视口与投影变换**:视口转换将3D空间的坐标映射到2D窗口上,而投影变换则负责模拟不同的视角,如透视和正交投影。 6. **模型视图矩阵**:用于移动、旋转和缩放对象。理解如何使用`glTranslate`、`glRotate`和`...

    OpenGL-zhifeiji3Dsanshitu.zip_OpenGL三视图_opengl_outlineb2u_site:w

    为了将3D对象显示在2D屏幕上,我们需要进行投影变换,可以使用正交投影或透视投影,这里可能使用了正交投影来简化三视图的绘制。 2. **模型构建**:纸飞机的3D模型需要通过顶点数据定义,这通常涉及到三角形网格的...

    OpenGL坐标系讲解

    透视投影模拟人眼对远近物体的大小感知,而正交投影则在所有方向上保持比例,常用于2D制图或界面设计。 6. **归一化设备坐标系(NDC)** - 投影坐标经过进一步变换后,会进入归一化设备坐标系。在这个坐标系中,所有...

    OpenGL三维的空间变换[定义].pdf

    OpenGL提供了两种投影类型:透视投影和正投影。透视投影模拟真实世界的视觉效果,产生近大远小的深度感,常用于游戏和视觉效果。它通过`glFrustum`函数设置,定义了一个带有消失点的近似圆锥形的可视空间。而正投影...

    opengl求坐标

    2. **投影变换**:在处理3D图形时,我们需要将三维坐标投影到二维视口上,这通常通过透视投影或正交投影完成。透视投影模拟人眼观察物体的效果,物体远离观察者时会显得更小;正交投影则提供一种等距的观察方式,...

    学习vc++利用OpenGL实现三维绘图资料.pdf

    在定义投影方式时,OpenGL提供了正投影和透视投影两种方式。正投影保持物体大小不变,常用于CAD应用,而透视投影则模仿人类视觉,使近处物体显得较大,远处物体较小,适用于创建具有深度感的场景。通过`glOrtho`或`...

Global site tag (gtag.js) - Google Analytics