Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5513387
  • 博文数量: 763
  • 博客积分: 12108
  • 博客等级: 上将
  • 技术积分: 15717
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-28 21:21
个人简介

业精于勤,荒于嬉

文章分类

全部博文(763)

文章存档

2018年(6)

2017年(15)

2016年(2)

2015年(31)

2014年(14)

2013年(87)

2012年(75)

2011年(94)

2010年(190)

2009年(38)

2008年(183)

2007年(28)

分类: C/C++

2010-05-25 19:01:01

下载下面的VC工程并运行它(glut0.zip)(这个就是上一节的工程)。你将看到两个窗口:一个控制台窗口,一个OpenGL窗口。

现在改变窗口大小使高度与宽度不再相等,这时三角形发生变形。这会发生是因为你没有正确设置投影矩阵默认的是透视投影矩阵且高宽比为1.因此高宽比改变了,投影就会变形。因此只要高宽比改变了,投影就应该重新计算。

 

GLUT定义了当窗口大小改变时哪一个函数应该被调用。此外,这个函数还会在窗口初次被创建时调用,保证初始化窗口不是正方形的时候渲染也不会变形出错。

 

这个函数是glutReshapeFunc()。

void glutReshapeFunc(void(*func)(int width,int height));

参数:

func: 指负责设置正确投影的函数的名称。

因此我们必须做的第一件事是回到main()函数。在上一章的代码里加入对glutReshapeFunc()的调用,让我们把负责窗口尺寸的函数叫做changeSize。现在的代码如下。

void main(int argc, char **argv)
{        
  glutInit(&argc, argv);        
  glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);       
  glutInitWindowPosition(100,100);        
  glutInitWindowSize(320,320);        
  glutCreateWindow("我的测试");        
  glutDisplayFunc(renderScene);                
  // Here is our new entry in the main function         
  glutReshapeFunc(changeSize);                
  glutMainLoop();
}

下面我们需要做的就是定义函数changeSize()。

glutReshapeFunc()函数的声明可以看到,changSize()函数有两个形参。。这两个参数代表新的窗口高度和宽度

void changeSize(int w, int h)
{         
  // 防止除数即高度为0        
  // (你可以设置窗口宽度为0).        
  if(h == 0)  h = 1;        
  
  float ratio = 1.0* w / h;        
  // 单位化投影矩阵。        
  glMatrixMode(GL_PROJECTION);       
  glLoadIdentity();                
  // 设置视口大小为增个窗口大小   
  glViewport(0, 0, w, h);    
  // 设置正确的投影矩阵 
  gluPerspective(45,ratio,1,1000);  
  //下面是设置模型视图矩阵     
  glMatrixMode(GL_MODELVIEW); 
  glLoadIdentity(); 
  gluLookAt(0.0,0.0,5.0, 0.0,0.0,-1.0,0.0f,1.0f,0.0f);
}

我们在上一小段代码里引进了一些函数。下面让我们详细讲解,以免让你感到很迷茫。

第一步是计算高宽比(wight/height)。注意为了计算正确,我们必须保证高度不为0。

 

接着,我们设置当前矩阵为投影矩阵,这个矩阵定义了一个可视空间(viewing volume)。

我们调用一个单位矩阵来初始化投影矩阵。然后我们用函数glViewport把视口设置为整个窗口。你也可以设置不同的值。函数中(0,0)指定了视口的左下角,(w,h)指定了视口矩形的大小。注意这个坐标是和客户区域有关的,而不是屏幕坐标。。

 

gluPerspective函数是其他OpenGL库(GLU库)里的一个函数。(gluPerspective函数的参数,设置请参见其他书籍。我并不想在GLUT讲解里再加入其他一些OpenGL内容的讲解。)

 

最后就是设置模型观测矩阵。调用GL_MODELVIEW把当前矩阵设为模型观测矩阵。gluLookAt()也是GLU库里的一个函数,其参数详细设置参见其他书籍。

 

下面是这章的VC工程(glut1.zip),你可以自己设置大小,改变参数值。要真正弄懂程序究竟是怎样运行的。

  (本人翻译水平有限,错误之处望指正,谢谢)
文章来源:

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xie_zi/archive/2007/12/02/1911777.aspx

阅读(1751) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~