计算机图形学入门

这几天需要用OpenGL做一个小程序,之前没有计算机图形学和OpenGL的基础,以为很简单(事实上确实不难),但是在自己摸索的过程中却走了一些弯路。现在稍微总结一下。

1 坐标系统

从定义一个零件的几何外形到图形设备上生成相应的图形,需要建立相应的坐标系统来描述,并通过坐标变换来实现图形的表达。有几个坐标系需要了解一下。

1. 1 世界坐标系(world coordinate system)

或者把它叫做场景坐标系吧,是一个三维坐标系,多用右手直角坐标系,用来描述物体所处的场景空间。坐标原点在屏幕中心,Z轴垂直于屏幕指向屏幕外,y轴竖直向上,x轴水平向右。

1.2 物体本地坐标

用来定义某个实体本身的坐标系。例如,stl文件中包含了构成实体模型的三角面片的顶点坐标,这里的顶点坐标值就是在物体本地坐标系下的坐标值。

1.3 设备坐标系(device coordinate system)

也称为物理坐标系,是一个二维坐标系,与图形输出设备相关联,用来表示三维模型投影后生成的二维图形显示在图形输出器(例如显示器)的坐标系。单位是象素(对于显示器来说)。

1.4 规格化设备坐标系(normalized device coordinate system)

这是一个人为规定的假象设备坐标系,与设备无关,目的是为了方便将图形软件应用到不同分辨率的设备。该坐标系的坐标轴方向以及原点与设备坐标系相同,但是它最大的坐标范围是1.
首先将输出图形转换为规格化设备坐标系,当转换到具体的不同输出设备时,只需要将图形的规格化坐标系再乘以相应设备分辨率即可,这样使图形软件与图形设备分离开来,增加了图形软件的可移植性。

2 投影(projection)和视景体(viewing volume)

我们在3D坐标系统定义模型,但是我们在屏幕上显示模型时只能使用二维坐标系,从三维坐标转换到二维坐标,这里就需要用到投影。我们可以用正投影(orthographic projection)或者透视投影(perspective projection)。关于这两个投影的性质就不讲了,网上很多。

2.1 视景体

我个人觉得这是很重要的一个概念,简单地来说,视景体就是三维空间中的一个封闭区域。在这个区域内的模型才能被显示在屏幕上,在这个区域外的部分会被裁剪掉,不会显示在屏幕上。视景体的大小范围是可以设置的,具体方法就是用上面的两种投影。

2.2 通过正投影设置的视景体

正投影设置的视景体是一个长方体,我们通过设置视景体xyz轴最大最小坐标来定义它。在OpenGL中可以用
GLFrustum::SetOrthographic(GLfloat xMin,GLfloat xMax,GLfloat yMin,GLfloat yMax,GLfloat zMin,GLfloat zMax)来定义,也可以用glOrtho(left, right, bottom, top, near, far)来定义。
在正投影中,观察者的位置假定在z轴正无穷处。

正投影实景体的形状
图片来源于网络,原网址是http://jerome.jouvie.free.fr/opengl-tutorials/Lesson1.php#ClippingPlane

2.3 通过透视投影设置的视景体

透视投影设置的视景体是一个平截头体(frustum),它的形状是一个金字塔被截去塔尖之后的形状。

frustum的形状及参数
frustum在坐标系中的位置

图片来源于网络,原网址是http://jerome.jouvie.free.fr/opengl-tutorials/Lesson1.php#ClippingPlane
在OpenGL中我们可以用GLFrustum::setPerspective(float fFov,float fAspect, float fNear,float fFar)或者gluPerspective(fovy, aspect, near, far)来定义。
在透视投影中,观察者的位置默认在坐标原点(0,0,0),从z轴正向看向z轴负向。为了我们的模型落在视景体内,我们还需要经过一些变换。

3 变换

3.1 点的齐次坐标表示

齐次坐标是将一个n维空间的点用n+1维的向量来表示,即附加了一个坐标。也就是说,我们使用一个四维行向量(或者说1X4的矩阵)[x,y,z,w]来表示三维空间中的一个点(x,y,z)。采用齐次坐标系的优点:(1)为几何图形的二维、三维甚至更高维空间的坐标变换提供统一的矩阵运算方法。(2)处理无穷远点比较方便。

3.2 图形变换

变换矩阵
为了将一个模型放到一个场景中,摆在某一个位置,朝着某个方向,这就要将模型在本地坐标系下的值转换到场景坐标系下的值,我们用矩阵运算来实现这一点。一个变换矩阵表示了场景空间中的一个特定位置,以及相对于视觉坐标系的3个轴上的方向。
一个4X4变换矩阵的第一个列向量表示本地坐标系x轴在场景坐标系中的方向,第二个列向量表示本地坐标系y轴在场景坐标系中的方向,第三个表示z轴在场景坐标系中的方向,第四列表示本地坐标系的原点在场景坐标系下的位置。也就是说,通过变换矩阵运算,我们把本地坐标系的原点放在了场景坐标系中的一个点,把本地坐标系的xyz轴对准了某个方向,这样就在场景中摆放好了我们的模型。
拿二维举例来说:
这里写图片描述
上面这个矩阵将物体坐标系原点放到场景坐标系的(2,2)处,物体坐标系的x轴朝着(1,0)方向,y轴朝着(0,-1)方向。物体本地坐标系下的(1,1)点在场景坐标系下的坐标点为(3,1),画个坐标图的话一目了然。

  • 19
    点赞
  • 153
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
第1章绪论 1.1计算机图形学及其相关概念 1.2计算机图形学的发展 1.2.1计算机图形学学科的发展 1.2.2图形硬件设备的发展 1.2.3图形软件的发展 1.3计算机图形学的应用 1.3.1计算机辅助设计与制造 1.3.2计算机辅助绘图 1.3.3计算机辅助教学 1.3.4办公自动化和电子出版技术 1.3.5计算机艺术 1.3.6在工业控制及交通方面的应用 1.3.7在医疗卫生方面的应用 1.3.8图形用户界面 1.4计算机图形学研究动态 1.4.1计算机动画 1.4.2地理信息系统 1.4.3人机交互 1.4.4真实感图形显示 1.4.5虚拟现实 1.4.6科学计算可视化 1.4.7并行图形处理 第2章计算机图形系统及图形硬件 2.1计算机图形系统概述 2.1.1计算机图形系统的功能 2.1.2计算机图形系统的结构 2.2图形输入设备 2.2.1键盘 2.2.2鼠标器 2.2.3光笔 2.2.4触摸屏 2.2.5操纵杆 2.2.6跟踪球和空间球 2.2.7数据手套 2.2.8数字化仪 2.2.9图像扫描仪 2.2.10声频输入系统 2.2.11视频输入系统 2.3图形显示设备 2.3.1阴极射线管 2.3.2CRT图形显示器 2.3.3平板显示器 2.3.4三维观察设备 2.4图形显示子系统 2.4.1光栅扫描图形显示子系统的结构 2.4.2绘制流水线 2.4.3相关概念 2.5图形硬拷贝设备 2.5.1打印机 2.5.2绘图仪 2.6OpenGL图形软件包 2.6.1OpenGL的主要功能 2.6.2OpenGL的绘制流程 2.6.3OpenGL的基本语法 2.6.4一个完整的OpenGL程序 第3章用户接口与交互式技术 3.1用户接口设计 3.1.1用户模型 3.1.2显示屏幕的有效利用 3.1.3反馈 3.1.4一致性原则 3.1.5减少记忆量 3.1.6回退和出错处理 3.1.7联机帮助 3.1.8视觉效果设计 3.1.9适应不同的用户 3.2逻辑输入设备与输入处理 3.2.1逻辑输入设备 3.2.2输入模式 3.3交互式绘图技术 3.3.1基本交互式绘图技术 3.3.2三维交互技术 3.4OpenGL中橡皮筋技术的实现 3.4.1基于鼠标的实现 3.4.2基于键盘的实现 3.5OpenGL中拾取操作的实现 3.6OpenGL的菜单功能 第4章图形的表示与数据结构 4.1基本概念 4.1.1基本图形元素 4.1.2几何信息与拓扑信息 4.1.3坐标系 4.1.4实体的定义 4.1.5正则集合运算 4.1.6平面多面体与欧拉公式 4.2三维形体的表示 4.2.1多边形表面模型 4.2.2扫描表示 4.2.3构造实体几何法 4.2.4空间位置枚举表示 4.2.5八叉树 4.2.6BSP树 4.2.7OpenGL中的实体模型函数 4.3非规则对象的表示 4.3.1分形几何 4.3.2形状语法 4.3.3粒子系统 4.3.4基于物理的建模 4.3.5数据场的可视化 4.4层次建模 4.4.1段与层次建模 4.4.2层次模型的实现 4.4.3OpenGL中层次模型的实现 第5章基本图形生成算法 5.1直线的扫描转换 5.1.1数值微分法 5.1.2中点Bresenham算法 5.1.3Bresenham算法 5.2圆的扫描转换 5.2.1八分法画圆 5.2.2中点Bresenham画圆算法 5.3椭圆的扫描转换 5.3.1椭圆的特征 5.3.2椭圆的中点Bresenham算法 5.4多边形的扫描转换与区域填充 5.4.1多边形的扫描转换 5.4.2边缘填充算法 5.4.3区域填充 5.4.4其他相关概念 5.5字符处理 5.5.1点阵字符 5.5.2矢量字符 5.6属性处理 5.6.1线型和线宽 5.6.2字符的属性 5.6.3区域填充的属性 5.7反走样 5.7.1过取样 5.7.2简单的区域取样 5.7.3加权区域取样 5.8在OpenGL中绘制图形 5.8.1点的绘制 5.8.2直线的绘制 5.8.3多边形面的绘制 5.8.4OpenGL中的字符函数 5.8.5OpenGL中的反走样 第6章二维变换及二维观察 6.1基本概念 6.2基本几何变换 6.2.1平移变换 6.2.2比例变换 6.2.3旋转变换 6.2.4对称变换 6.2.5错切变换 6.2.6二维图形几何变换的计算 6.3复合变换 6.3.1二维复合平移变换和比例变换 6.3.2二维复合旋转变换 6.3.4其他二维复合变换 6.3.5相对任一参考点的二维几何变换 6.3.6相对于任意方向的二维几何变换 6.3.7坐标系之间的变换 6.3.8光栅变换 6.3.9变换的性质 6.4二维观察 6.4.1基本概念 6.4.2?用户坐标系到观察坐标系的变换 6.4.3?窗口到视区的变换 6.5?裁剪 6.5.1?点的裁剪 6.5.2直线段的裁剪 6.5.3多边形的裁剪 6.5.4其他裁剪 6.6OpenGL中的二维观察变换 第7章三维变换及三维观察 7.1三维变换的基本概念 7.1.1几何变换 7.1.2三维齐次坐标变换矩阵 7.1.3平面几何投影 7.2三维几何变换 7.2.1三维基本几何变换 7.2.2三维复合变换 7.3三维投影变换 7.3.1正投影 7.3.2斜投影 7.4透视投影 7.4.1一点透视 7.4.2二点透视 7.4.3三点透视 7.5观察坐标系及观察空间 7.5.1观察坐标系 7.5.2观察空间 7.6三维观察流程 7.6.1用户坐标系到观察坐标系的变换 7.6.2平行投影的规范化投影变换 7.6.3透视投影的规范化投影变换 7.7三维裁剪 7.7.1关于规范化观察空间的裁剪 7.7.2齐次坐标空间的裁剪 7.8OpenGL中的变换 7.8.1矩阵堆栈 7.8.2模型视图变换 7.8.3投影变换 7.8.4实例 第8章曲线与曲面 8.1基本概念 8.1.1曲线/曲面数学描述的发展 8.1.2曲线/曲面的表示要求 8.1.3曲线/曲面的表示 8.1.4插值与逼近 8.1.5连续性条件 8.1.6样条描述 8.2三次样条 8.2.1自然三次样条 8.2.2Hermite插值样条 8.3Bezier曲线/曲面 8.3.1Bezier曲线的定义 8.3.2Bezier曲线的性质 8.3.3Bezier曲线的生成 8.3.4Bezier曲面 8.4B样条曲线/曲面 8.4.1B样条曲线 8.4.2B样条曲线的性质 8.4.3B样条曲面 8.5有理样条曲线/曲面 8.5.1NURBS曲线/曲面的定义 8.5.2有理基函数的性质 8.5.3NURBS曲线/曲面的特点 8.6曲线/曲面的转换和计算 8.6.1样条曲线/曲面的转换 8.6.2样条曲线/曲面的离散生成 8.7OpenGL生成曲线/曲面 8.7.1Bezier曲线/曲面函数 8.7.2GLU中的B样条曲线/曲面函数 第9章消隐 9.1深度缓存器算法 9.2区间扫描线算法 9.3深度排序算法 9.4区域细分算法 9.5光线投射算法 9.6BSP树 9.7多边形区域排序算法 9.8OpenGL中的消隐处理 第10章真实感图形绘制 10.1简单光照模型 10.1.1环境光 10.1.2漫反射光 10.1.3镜面反射光 10.1.4光强衰减 10.1.5颜色 10.2基于简单光照模型的多边形绘制 10.2.1恒定光强的多边形绘制 10.2.2Gouraud明暗处理 10.2.3Phong明暗处理 10.3透明处理 10.4产生阴影 10.5模拟景物表面细节 10.5.1用多边形模拟表面细节 10.5.2纹理的定义和映射 10.5.3凹凸映射 10.6整体光照模型与光线追踪 10.6.1整体光照模型 10.6.2Whitted光照模型 10.6.3光线跟踪算法 10.6.4光线跟踪反走样 10.7 OpenGL中的光照与表面绘制函数 10.7.1 OpenGL点光源 10.7.2 OpenGL全局光照 10.7.3 OpenGL表面材质 10.7.4 OpenGL透明处理 10.7.5 OpenGL表面绘制 10.7.6 实例 10.8 OpenGL中的纹理映射

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值