opengl红宝书第三章 视图 拾遗

来源:互联网 发布:linux 进程执行了sleep 编辑:程序博客网 时间:2024/04/28 12:02

       gluLookAt(ex,ey,ez,cx,cy,cz,upx,upy,upz) 以e坐标决定照相机的空间位置,c坐标决定照相机的镜头朝向,up坐标决定照相机的朝上位置。以此法定义的视图矩阵将会右乘当前矩阵。

       在调用glMatrixMode函数修改当前矩阵时,一般都会在此函数后加glLoadIdentity(),来确保当前矩阵为一个单位矩阵。

       无论是对窗口内的模型、图像作什么样的位移操作,其实都是通过定义一个变换矩阵与当前矩阵相乘来实现的。因此,为了使得所有操作都是通过乘法实现,OPENGL中的矩阵都是4*4,如下形式:

{a,b,c,p;      其中,第四列前三行,即pqr三数是控制图形透视变换的位置;第四列第四行S是控制整体比例变换的,也就是glScale;

 d,e,f,q;       第四行前三列,lmn是控制平移变换;前三行前三列,则是旋转比例变换位。

  j,h,i,r;         在平移变换时,变换矩阵中的lmn分别代表xyz平移的幅度,即是x=x+l,y+=m,z+=n;

 l,m,n,s}       在比例变换时,其实在a-s对角线上的位置都是比例控制位,变换矩阵上的数代表着比例变换幅度,x*=a,y*=e,z*=i。而s

是整体的一个比例变换。

      绕某轴旋转时,在前三行三列,需要将第i行第i列置1,x对应1,y为2,z为3.而剩下的两个数j,k(j<k)构成的j行j、k列,k行j、k列分别为cosθ,sinθ,-sinθ,cosθ.

       而关于某轴对称时,是将i行i列置1,j行j列与K行k列置-1即可。


     glDepthRange(near,far) 定义z坐标的一种编码形式与深度缓冲区的最大最小值。

    在使用投影函数时,我们所说的近裁面与远裁面都是指的z轴上的负方向,即是如果近裁面是1,远裁面是3,那么所有物体的Z坐标就必须在-3~-1之间。

     glClipPlane(GLenum plane,*equation)  equation是一个4维向量的指针,plane参数是GL_CLIP_PLANEi,定义的是剪裁面的编号。equation向量中,代表着一个方程Ax+By+Cz+D=0.只有高于这个平面的部分才会被显示出来

        

        对于平面坐标转世界坐标的操作,我在许多地方都曾用到,比如trackball的设计中。那么gluUnProject(winx,winy,winz,modelmatrix,projmatrix,viewport,objx,objy,objz)这个函数就是必须要记住的。win代表着屏幕坐标,winz一般是深度值,modelmatrix、projmatrix分别是模型矩阵与投影矩阵,最后值被存在obj里。



是以,2017/5/23 书于526.D

原创粉丝点击