opengl算法学习---二维观察
概述
二维观察需确定的两个核心问题
二维场景中的图形的哪部分需要显示、输出设备的图形在什么位置显示
二维场景中要显示的部分称为窗口或裁剪窗口(windows)
将窗口内容映射到显示设备上的指定坐标区域称为视区(Viewport)
窗口如同镜头,决定待观察图形的具体部位,而视区指定在显示设备上的具体位置区域进行放映观察。
通过改变窗口与视区的位置,我们可以在输出设备显示区域的不同位置来观察二维对象的不同部位,也可以通过改变窗口与视区的尺寸来改变显示对象的尺寸。
二维观察流水线
一般将二维窗口的内容到设备视区的映射称为二维观察变换,有时也将它简单地称为视口变换(Windows-to-Viewport Transformation,窗口到视区的变换)
坐标系统
建模坐标系-局部坐标系 Modeling Coordinate System, MC
世界坐标系-全局坐标系 World Coordinate System, MC
观察坐标系-视角转换 Viewing Coordinate System, VC
规范化设备坐标系-中间坐标系独立于设备 Normalizing Device Coordinate System, NDC
设备坐标系 Device Coordinate System, DC
坐标系间的变换
为创建和显示一个或多个二维对象,首先在建模(局部)坐标系中定义这些对象,再将其组装定位到世界坐标系中;然后,指定视点的位置、视线方向,确定观察坐标系,根据显示要求确定投影面的位置,对物体进行投影变换,得到物体的投影,并将其变换到规范化设备坐标系中;最后,再将投影结果映射到设备坐标系下,完成其到输出设备的输出显示。
1建模变换 Modeling Transformation, MT
MT就是指将在建模坐标系中(局部坐标系)建模的物体放到统一的世界坐标系(全局坐标系)的过程,实现由简单图形生成复杂图形、单个物体到多个物体的组合。它通常可通过平移、旋转、伸缩等简单变换的组合来实现。
2观察变换 Viewing Transformation, VT
VT指从世界坐标空间到观察坐标空间的变换,也称视点变换。通常观察坐标系的原点模拟视点或摄像机的位置,Z轴与观察方向共线,它可被放在世界坐标系中的任意位置并指向任意方向还可随意旋转,这样可以很好地模拟人眼或摄像机的观察,能够从任意位置来观察图形对象。
观察变换可由旋转变换、平移变换合成。
3视口变换 Windows-to-Viewport Transformation, WT
视口变换是指在规范化空间给定一个窗口,在显示设备给定的一个视区,实现二维图形对象由窗口到视区的变换。它其实就是根据用户所给定的参数找到窗口和视区之间的坐标映射关系。
裁剪
裁剪是从数据集合提取信息的过程,它是计算机图形学许多重要问题的基础。裁剪典型的用途就是从一个大的场景中提取所需的信息以显示某一局部场景或视图。比如浏览地图时对感兴趣的区域放大显示,此时窗口内显示的内容会相应减少。确定图形的哪些部分在窗口内,哪些部分在窗口外不可见区域,只显示窗口内的那部分图形,这个选择处理过程就是裁剪。
被裁剪的对象可以是点、线段、圆弧段、多边形、字符以及由它们构成的各种图形。线段裁剪是图形裁剪的基础。二维的裁剪窗口通常为一个矩形范围,而三维空间的剪裁窗口则通常称裁剪空间指投影空间中的视见体(四棱台或四棱柱)。
点裁剪
对点(x,y)的裁剪可理解为对点在窗口内(某种图形区域)的包含检测。
1.裁剪窗口为矩形
\(设矩形窗口的左下角点坐标为(x_{L},y_{B}),右上角点坐标为(x_{R},y_{T}),则满足如下两不等式\)
的点在矩形窗口内。
2.裁剪窗口为不规则多边形
射线法 弧长法
直线裁剪
多边形裁剪
多边形的裁剪算法主要解决两个问题:
(1)一个封闭的多边形被裁剪后通常变得不再封闭,需要用窗口边界的适当部分来将其封闭。
(2)一个凹多边形被裁剪后可能形成几个小多边形,要正确封闭它们。
其他裁剪
图形布尔运算是指对平面上的两个图形进行集合逻辑运算以得到新的图形,运算是以图形为被运算对象。(光栅裁剪)
opengl二维观察
OPenGL投影模式
在选择OpenGL裁剪窗口和视口参数设定之前,必须建立合适的投影模式以便构建从世界坐标系到屏幕坐标系
变换的矩阵,通过函数void glMatrixMode (GLenum mode)
来设定当前矩阵,参数mode的取值为
GL MODELVIEW //模型视图 矩阵
GL PROJECTION //投影变换矩阵
GL TEXTURE //纹理映射矩阵
投影模式的复位(初始化)操作为: glLoadldentity();
可保证每次进入投影模式时矩阵重新被设定为单位矩阵,从而新的观察状态与参数设定不受历史操作的影响。
GLU裁剪窗口函数
void gluOrtho2D (GLdouble left, GLdouble right,GLdouble bottom, GLdouble top)
定义了一个二维裁剪窗口,用于截取世界坐标系下相对应地区域。本质上它是一个特殊的正交投影变换,主要用于
二维图形到二维屏幕上的投影,裁剪面是一个左下角点为(left, bottom)、右上角点为(right, right)的矩形。
OPenGL视区函数
视区函数的任务是将经过几何变换、投影变换和剪裁变换后的图形物体显示于屏幕窗口内指定的视区内:
gIViewport (Glint X, Glint y, GLsizei width, GLsizei height);
其中(Glint x, Glinty)用于指定视区左下角点的坐标,它与待显示窗口的左下角对应。参数width和height分别是视口的宽度和高度。默认为(0, 0, winWidth, winHeight)指的是屏幕窗口的实际尺寸大小。所有这些值都是以像素为单位,全为整型数。