学习OpenGL(一)

从基础学起...............
刚开始接触对各种坐标系神马的完全是蒙圈的状态,还有矩阵的算法等等...  其实看了半天也没个整体概念,只是零零散散的一些概念,

因为画图主要是从电脑屏幕上看,所以此坐标很重要

                                                                                  视图



坐标是:

学习OpenGL(一)

所以就先说说一些接口的意思

第一类接口就是关于透射和正射的,投射的效果就是远处的物体就会从视觉上变小,如下图:

正射的效果就是物体多大就是多大,像在电脑屏幕上看东西,不会因为远就会导致物体变小

glortho(left,right,bottom,top,near,far)

解释:一个正射投影函数,创建一个平行视景体.实际上这个函数的操作是创建一个正射投影矩阵
通俗点就是把目标物体装进这个矩阵里,显示截出来的部分

gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar)

解释:一个透射函数, fovy是视角的大小,可控制看到物体局部还是全部

                             aspect是窗口的纵横比   x/y或者w/h

视野角度为a
    观察点与物体的距离: d
    物体的大小(高): h
 公式:    tan(a/2) = h/(d/2)
      a = 2.0*atan2(h/2,d)
      deg = (180.0*a)/PI


实际计算时,并不知道物体大小,所以 
大概计算一下整个三位空间的中心点,然后到最边缘点的距离就是外界球体的半径,假设中心点是 center(cx,cy,cz),
最边缘点是 max(mx,my,mz)
半径就是r = sqrt(pow(mx-cx,2),pow(my-cy,2),pow(mz-cz,2))
观察点到中心的距离 d = sqrt(pow(vx-cx,2),pow(vy-cy,2),pow(vz-cz,2))
半角的正切是 r/d,度数 180*r/d/PI

为了获得逼真感 观察点与屏幕的距离小于2.45cm

void glFrustum(GLdouble left,GLdouble Right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);

解释:一个投射函数,这个接口需要填写具体的左右上下的参数了


使用:

  1. void Reshape(int width, int height)//重绘窗口    
  2. {    
  3.  // 创建透视效果视图    
  4.     glMatrixMode(GL_PROJECTION);    
  5.     glLoadIdentity();   
  6.     glFrustum(-2, 2, -2, 2, 4.828, 100);    
  7.     glViewport(0, 0, width, height);  
  8.     glMatrixMode(GL_MODELVIEW);  
  9. }  

  1. void Reshape(int width, int height)  
  2. {  
  3.      // 创建透视效果视图  
  4.     glMatrixMode(GL_PROJECTION);  
  5.     glLoadIdentity();  
  6.     gluPerspective(45.0f,1,4.828f,100.0f);//广角为45度,  
  7.     glViewport(0, 0, width, height);  
  8.     glMatrixMode(GL_MODELVIEW);  
  9. }

如果用一个前后是正方形的视景体截取图像,但是最后显示是用长方形viewport,会把图形压扁,如果想显示正常,则将视景体的左右值根据viewport比例裁剪图像;
(left*(w/h),right*(w/h),top,bottom.near,far)

疑问:百度百科说near和far一般同时为正或负  //这点应该是错的,因为opengl入门书中就有符号不同的例子

void glViewport(GLint x,Glint y,GLsizei width,GLsizei height)

解释:x.y是左下角的点

所有关于视图等的接口都是矩阵变换,因此在变换之前要声明是什么变换

glMatrixMode(GL_PROJECTION);  

glMatrixMode(GL_MODELVIEW);