`
tiankefeng0520
  • 浏览: 142906 次
  • 性别: 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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics