opengl--重新开始--04 视图

来源:互联网 发布:网络渲染什么意思 编辑:程序博客网 时间:2024/05/08 06:51
三 视图


计算机图形的要点就是创建三维物体的二维图像
视图变换:固定好摄像机位置 朝向 方向。 gluLookAt
模型变换:设置模型的位置和方向,旋转移动缩放
投影变换:
视口变换:决定场景所映射的有效屏幕区域的形状
绘制场景


1)通用的变换函数:
void glMatrixMode(Glenum mode):指定需要修改的是模型视图矩阵、投影矩阵还是纹理矩阵。
mode:GL_MODELVIEW/GL_PROJECTION/GL_TEXTURE
void gLLoadIdentity(void):把当前可修改助阵清除为单位矩阵


显式的指定一个特定的矩阵,可以用glLoadMatrix*() glLoadTransposeMatrix*()
可以用glMultMatrix*()或glMultTransposeMatrix*()函数把当前矩阵与参数所指定的矩阵相乘


2)视图变换
执行模型或视图变换之前,必须以GL_MODELVIEW为参数调用glMatrixMode()函数
全局固定坐标系统:乘法出现的顺序与他们在代码中出现的顺序相反。
局部移动坐标系统:想象出一个固定到所绘制物体的局部坐标系统,所有的操作都是针对这个不断发生变化的坐标系统进行的。
     这样矩阵乘法就可以自然的按照他们在代码中的顺序进行了。
3)模型变换
glTranlate
{fd}() glRotate{fd}() glScale{fd}()
4)视图变换
使用工具函数库gluLookAt()函数定义一条视线 这个函数封装了一系列的旋转和移动函数
void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,
               GLdouble centerx,GLdouble centery,GLdouble centerz,
               GLdouble upx,GLdouble upy,GLdouble upz)
三组参数 分别是观察点 相机瞄准的参考点 和 哪个方向朝上
5)投影变换
首先 glMatrixMode(GL_PROJECTION)
     glLoadIdentity()

这样接下来的变换函数将影响投影矩阵 而不是模型变换矩阵。投影变换的目的是定义一个视景体
 5.1 透视投影
void glFrustum(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top GLdouble near,GLdouble far) 
定义了一个平截头体
gluPerspective: 创建沿视线方向同时对称于x轴和y轴的平截头体。
void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble near,GLdouble far)
c创建一个表示对称透视视图平截头体的矩阵,并把它与当前矩阵相乘。
fovy:yz平面上视野的角度(0-180)
aspect:纵横比 宽/高
near/far:观察点与近侧及远侧裁剪平面的距离,两个值都是正的
 5.2正投影
glOrtho
(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top, GLdouble near,GLdouble far) 
视景体是平行的长方体:远近一样大
gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top)
创建一个表示把二维图标投影到屏幕上的矩阵,并把当前矩阵与它相乘


 5.3视景体裁剪


6)视口变换
视口是一个矩形的窗口区域,图像就是在这个区域中绘制的,视口是用窗口坐标测量的
void glViewport(GLint x,GLinty, GLsizei width, GLsizei height)
视口的纵横比一般跟视景体的纵横比相同,如果不同,图像投影就会变形


深度坐标是在视口变换期间进行编码的(以后存储在深度缓冲区)。opengl中z左边总是被认为位于0-1.0的范围之间
void glDepthRange(GLclampd near, GLclampd far):


其他裁剪平面
void glClipPlane(GLenum plane,const GLdouble* equation)
定义一个裁剪平面,equation参数纸箱平面方程Ax+By+Cz+D=0的4个系数
每个平面都是Ax+By+Cz+D=0指定的
除视景体6个裁剪平面外 最多可再建立6个其他裁剪平面
glEnable(GL_CLIP_PLANEi)


7)逆变换和模拟变换
类似鼠标点击屏幕事件需要确定屏幕位置源于三维空间的地方
int gluUnProject(GLdouble winx,GLdouble winy,GLdouble winz
                 const GLdouble modelMatrix[16],
                 const GLdouble projMatrix[16],
                 const GLint viewport[4],GLdouble *objx,GLdouble*objy,GLdouble*objz)
modelMatrix:模型矩阵
projMatrix:投影矩阵
viewport:视口
objx、objy、objz:返回的三维空间的物体的坐标
0 0
原创粉丝点击