首页计算机计算机应用CADCAM技术基础 04 第四章 图形图像处理技术基础.pptx

04 第四章 图形图像处理技术基础.pptx

页数:83页文件大小:1.28 MB来源: CADCAM技术基础ppt课件

本课件从图形的基本构成讲起,系统给出比例、对称、旋转、错切、平移与齐次变换矩阵,推导绕任意点与任意直线的组合变换,介绍投影变换分类,并讲解Z缓冲区、扫描线、区域子分与光线投射等消隐算法,以及光照、贴图与裁剪技术。

第4章 图形图像处理技术基础章首页,标示本章围绕几何变换、消隐、光照、贴图与裁剪展开
本页为图片内容,紧接第4章章首页之后、位于「第4章内容导览」之前。
第4章内容导览页,列出几何变换、消隐、光照、纹理贴图与图形裁剪五项内容
查看本课件的文字版(共 83 页,供检索与复制)

第1页:第4章图形图像处理技术基础

第4章 图形图像处理技术基础

第2页:

第3页:第4章内容导览

第4章 图形图像处理技术基础

图形处理的意义
生成图形、真实感显示图像、由一已知图形 → 新的图形

图形处理的内容:

  1. 图形的几何变换
  2. 图形的消隐技术
  3. 图形的光照技术
  4. 纹理贴图
  5. 图形裁剪技术

第4页:图形的基本构成

1.1 引言:图形的基本构成 = 顶点坐标 + 拓扑关系。

  • 二维:顶点集为 n×2 矩阵 [x1 y1; x2 y2; …; xn yn]
  • 三维:顶点集为 n×3 矩阵 [x1 y1 z1; x2 y2 z2; …; xn yn zn]

第5页:图形变换的实质

图形变换的实质是点的变换:旧点(集)× 变换矩阵 →(矩阵运算)→ 新点(集),即 V* = V · T。

包括比例变换、对称变换、旋转变换、平移变换、投影变换等。

基础知识:向量、矩阵运算。

第6页:比例变换

1.2.1 比例变换:x' = a·x,y' = d·y

[x' y'] = [x y] · [a 0; 0 d]

  • a = d:等比例变换
  • a ≠ d:不等比例变换

第7页:对称变换

1.2.2 对称变换

  1. 对 x 轴对称:x' = x,y' = −y,[x' y'] = [x y] · [1 0; 0 −1]
  2. 对 y 轴对称:x' = −x,y' = y,[x' y'] = [x y] · [−1 0; 0 1]
  3. 对原点对称:x' = −x,y' = −y,[x' y'] = [x y] · [−1 0; 0 −1]
  4. 对 +45° 对称:x' = y,y' = x,[x' y'] = [x y] · [0 1; 1 0]
  5. 对 −45° 对称:x' = −y,y' = −x,[x' y'] = [x y] · [0 −1; −1 0]

第8页:二维综合变换矩阵

综合矩阵:[x' y'] = [x y] · [a b; c d],其中 a、b、c、d 取不同值可实现比例、对称、错切、旋转等变换。

第9页:旋转变换与错切变换

1.2.3 旋转变换:绕原点旋转 θ 角

[x' y'] = [x y] · [cosθ sinθ; −sinθ cosθ]

1.2.4 错切变换

  • 1) 沿 x 方向错切:[x' y'] = [x + cy y] = [x y] · [1 0; c 1]
  • 2) 沿 y 方向错切:[x' y'] = [x bx + y] = [x y] · [1 b; 0 1]

第10页:平移变换

1.2.5 平移变换:x' = x + Δx = x + l,y' = y + Δy = y + m

扩展变换矩阵 T = [a b; c d; l m],令 a = 1、b = 0、c = 0、d = 1,即可得到平移变换。

第11页:齐次变换矩阵

1.2.6 齐次变换矩阵

T = [a b p; c d q; l m s]

  • 元素 a、b、c、d 实现比例、对称、错切、旋转变换
  • 元素 l、m 实现平移变换
  • 元素 p、q 实现透视变换
  • 元素 s 实现全图形的比例变换

第12页:绕任意点的旋转变换

1.2.7 组合变换:1) 绕任意点 p(xp, yp) 的旋转变换

  1. (1) 将 p 点平移到坐标原点:T1 = [1 0 0; 0 1 0; −xp −yp 1]
  2. (2) 图形绕原点旋转 α 角:T2 = [cosα sinα 0; −sinα cosα 0; 0 0 1]

第13页:绕任意点旋转的组合矩阵

(续)绕任意点的旋转变换

  1. (3) 将旋转中心平移到原来的位置:T3 = [1 0 0; 0 1 0; xp yp 1]
  2. (4) 组合变换矩阵为:T = T1 · T2 · T3

第14页:绕任意直线的旋转变换

2) 绕任意直线 AB 的旋转变换(AB 的方程为 Ax + By + C = 0)

  1. (1) 平移 AB 使之过坐标原点:T1 = [1 0 0; 0 1 0; C/A 0 1](与 x 轴交于 (−C/A, 0))

第15页:绕任意直线旋转的旋转与对称

  1. (2) 将 AB 绕坐标原点顺时针旋转 α 角,使其与 x 轴重合:T2 = [cos(−α) sin(−α) 0; −sin(−α) cos(−α) 0; 0 0 1],其中 α = arctg(−A/B)
  2. (3) 对 x 轴做对称变换:T3 = [1 0 0; 0 −1 0; 0 0 1]

第16页:绕任意直线旋转的回位变换

  1. (4) 将 AB 绕坐标原点逆时针旋转 α 角,使其回到原位:T4 = [cosα sinα 0; −sinα cosα 0; 0 0 1]
  2. (5) 将 AB 平移回原来位置:T5 = [1 0 0; 0 1 0; −C/A 0 1]

第17页:绕任意直线旋转的组合矩阵

组合变换矩阵为:T = T1 · T2 · T3 · T4 · T5

第18页:OpenGL图形支持库

OpenGL(Open Graphics Libraries)

  • Hardware-independent:OpenGL 是到图形硬件的软件接口
  • About 120 commands → interactive 3D graphics
  • 是图形支持库,不是造型核心系统

第19页:三维齐次变换矩阵

1.3 三维变换:齐次变换矩阵

T = [a b c p; d e f q; h i j r; l m n s],[x' y' z' 1] = [x y z 1] · T

  • 元素 a~j 实现比例、对称、错切、旋转等变换
  • 元素 l、m、n 实现平移变换
  • 元素 p、q、r 实现透视变换
  • 元素 s 实现全比例变换

第20页:三维比例变换

三维比例变换:T = [a 0 0 0; 0 e 0 0; 0 0 j 0; 0 0 0 1],[x' y' z' 1] = [x y z 1] · T = [a·x e·y j·z 1]

OpenGL:glScaled(a, e, j);

第21页:对xoy平面的对称变换

1.3.3 对称变换:对 xoy 平面

T = [1 0 0 0; 0 1 0 0; 0 0 −1 0; 0 0 0 1],[x' y' z' 1] = [x y z 1] · T = [x y −z 1]

OpenGL:glScaled(1.0, 1.0, −1.0);

第22页:对xoz平面的对称变换

对 xoz 平面的对称变换

T = [1 0 0 0; 0 −1 0 0; 0 0 1 0; 0 0 0 1],[x' y' z' 1] = [x y z 1] · T = [x −y z 1]

OpenGL:glScaled(1.0, −1.0, 1.0);

第23页:对yoz平面的对称变换

对 yoz 平面的对称变换

T = [−1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 1],[x' y' z' 1] = [x y z 1] · T = [−x y z 1]

OpenGL:glScaled(−1.0, 1.0, 1.0);

第24页:绕x轴旋转变换

(1) 绕 x 轴旋转 α 角

T = [1 0 0 0; 0 cosα sinα 0; 0 −sinα cosα 0; 0 0 0 1],[x' y' z' 1] = [x y z 1] · T

OpenGL:glRotated(a, 1.0, 0.0, 0.0);

第25页:绕y轴旋转变换

(2) 绕 y 轴旋转 β 角

T = [cosβ 0 −sinβ 0; 0 1 0 0; sinβ 0 cosβ 0; 0 0 0 1],[x' y' z' 1] = [x y z 1] · T

OpenGL:glRotated(B, 0.0, 1.0, 0.0);

第26页:绕z轴旋转变换

(3) 绕 z 轴旋转 γ 角

T = [cosγ sinγ 0 0; −sinγ cosγ 0 0; 0 0 1 0; 0 0 0 1],[x' y' z' 1] = [x y z 1] · T

OpenGL:glRotated(r, 0.0, 0.0, 1.0);

第27页:三维平移变换

三维平移变换

T = [1 0 0 0; 0 1 0 0; 0 0 1 0; l m n 1],[x' y' z' 1] = [x y z 1] · T

OpenGL:glTranslated(l, m, n);

第28页:组合旋转的顺序影响

组合旋转时顺序对结果的影响

  • 方式一:1. 围绕 x 旋转 −90°;2. 围绕 y 旋转 90°
  • 方式二:1. 围绕 y 旋转 90°;2. 围绕 x 旋转 −90°

两种顺序得到的结果不同,说明矩阵乘法不满足交换律。

第29页:绕空间任意轴旋转(一)

P 绕空间轴 AA' 旋转 θ 角至 P',求 P' 的坐标

  1. (1) 平移 A 点,使 A 点过坐标原点:T1 = [1 0 0 0; 0 1 0 0; 0 0 1 0; −xA −yA −zA 1]

第30页:绕空间任意轴旋转(二)

  1. (2) 旋转 AA',使之与 Z 轴重合(先绕 x 轴旋转 α 角,再绕 y 轴旋转 −β 角)

其中 n = √(n1² + n2² + n3²),sinα = n2/n,cosα = n3/n,sinβ = n1/n,cosβ = n

第31页:绕空间任意轴旋转(三)

  1. (3) 使 P 点绕 z 轴旋转 θ 角:T3 = [cosθ sinθ 0 0; −sinθ cosθ 0 0; 0 0 1 0; 0 0 0 1]
  2. (4) 对步骤(2)做逆变换,使 AA' 回到原来的位置

第32页:绕空间任意轴旋转(四)

  1. (5) 对步骤(1)做逆变换,使 A 点回到原来的位置:T5 = [1 0 0 0; 0 1 0 0; 0 0 1 0; xA yA zA 1]
  2. (6) 组合变换矩阵:T = T1 · T2 · T3 · T4 · T5

第33页:绕空间轴旋转的OpenGL实现

绕空间任意轴旋转的 OpenGL 实现

glPushMatrix();
glTranslated(xa, ya, za);
glRotated(−a, 1.0, 0.0, 0.0);
glRotated(b, 0.0, 1.0, 0.0);
glRotated(r, 0.0, 0.0, 1.0);
glRotated(−b, 0.0, 1.0, 0.0);
glRotated(a, 1.0, 0.0, 0.0);
glTranslated(−xa, −ya, −za);
glVertex3d(Px, Py, Pz);
glPopMatrix();

第34页:数控机床运动变换矩阵

多轴数控机床的运动变换

  • MX = T(x, 0, 0);MY = T(0, y, 0);MZ = T(0, 0, z)
  • MB = RX(−45) · RZ(b) · RX(45)
  • MC = RZ(c)
  • 工件变换:MP = MP0 · MC · MB = RZ(c) · RX(−45) · RZ(b) · RX(45)
  • 刀具变换:MT = MT0 · MZ · MY · MX = MT0 · T(x, y, z)

涉及床身、X/Y/Z 轴、B 轴、C 轴、刀具、夹具与工件。

第35页:投影变换的分类

1.4 三维图形的投影变换

平行投影
直角投影:正面投影(主视图)、水平投影(俯视图)、侧面投影(侧视图)、正投影、正轴测投影(正等轴测、正二轴测)、斜角投影(斜轴测投影、斜等测、斜二测)
中心投影(透视变换)
一点透视、二点透视、三点透视

第36页:正面投影与水平面投影

1) 正面投影(XOZ 面,主视图):TV = [1 0 0 0; 0 0 0 0; 0 0 1 0; 0 0 0 1]

2) 水平面投影(俯视图):先绕 x 轴旋转 −90°,再沿 z 方向平移 −n,TH = [1 0 0 0; 0 0 0 0; 0 0 1 0; 0 0 −n 1](由旋转矩阵与平移矩阵相乘得到)。

第37页:侧面投影变换

3) 侧面投影(侧视图):绕 z 轴旋转 90°,再沿 x 方向平移 −l。

TW = [0 0 0 0; 0 1 0 0; 0 0 1 0; −l 0 0 1](由旋转矩阵与平移矩阵相乘得到)。

第38页:正等测与正二测投影

轴测投影变换

  • (1) 正等测投影变换:α = 35.2644°,γ = 45°
  • (2) 正二测投影变换:α = 19.47°,γ = 20.7°

变换矩阵由绕 z 轴旋转 γ 角与绕 x 轴旋转 α 角的两步矩阵相乘得到。

第39页:透视投影变换

透视(中心)投影变换:以视距 d 为参数,变换矩阵为

T = [1 0 0 0; 0 1 0 0; 0 0 0 −1/d; 0 0 0 1]

点 P 经变换后得到透视投影坐标。

第40页:图形的多义性

2.1 基本概念:图形的多义性 —— 同一幅线框图可以对应多种不同的三维形体解释,需要通过消隐加以明确。

第41页:以像素为单元的消隐算法

消隐算法 1) 以窗口内的每个像素为处理单元:确定每一个像素处场景中 k 个物体哪个距离观察点最近(可见),以其颜色来显示该像素。

for (窗口中的每个像素) { 确定距视点最近的物体,以该物体表面的颜色显示像素;}

第42页:以物体为单元的消隐算法

消隐算法 2) 以场景中的物体为处理单元:将一个物体与其余的 k−1 个物体逐一比较,仅显示可见的表面以达到消隐的目的。

for (场景中的每一个物体) { 将该物体与场景中的其它物体进行比较,确定其表面的可见部分;显示该物体表面的可见部分;} 通常用于线消隐。

第43页:提高消隐效率的方法

提高消隐算法效率的方法

  1. 利用连贯性:事物1 → 事物2,属性值通常是平缓过渡的;包括物体连贯性、面的连贯性、区域连贯性、扫描线的连贯性、深度连贯性
  2. 将透视投影转换成平行投影,减少计算量
  3. 包容盒(包围盒)
  4. 背面剔除:后向面或背面(锐角)不外法向;前向面(钝角)外法向
  5. 空间分割技术
  6. 物体的分层表示

第44页:重叠测试

1) 重叠测试:用包容盒判断两个物体的投影是否重叠。

若 xAmax ≤ xBmin 或 xAmin ≥ xBmax,或 yAmax ≤ yBmin 或 yAmin ≥ yBmax,则两物体不可能重叠,无需进一步求交。

第45页:包容性测试

2) 包容性测试:判断点是否落在多边形内部。

  • (1) 射线交点数算法:由被测点向任意方向引射线,交点个数为奇数则在内部,偶数则在外部
  • (2) 夹角求和法:计算被测点与多边形各边夹角的代数和,为 360° 则在内部,为 0° 则在外部

第46页:深度测试法

3) 深度测试法:比较同一投影点上两个表面 P1、P2 对应的深度值,深度小者离视点近,遮挡深度大者。

第47页:可见性测试

4) 可见性测试:表面法矢 N 与视线向量 S 的点积 N · S = |N||S|cosθ。

  • N · S > 0:该表面为前向面(可见)
  • N · S < 0:该表面为后向面(不可见,可剔除)

平面方程可写为 ax + by + cz + d = 0。

第48页:Z缓冲区消隐算法

2.3.1 Z 向深度缓冲区算法

  1. 设定深度缓冲存储器(Z 缓冲区),深度设为 −1
  2. 背景色初始化帧缓冲区
  3. 计算物体投影边界内每点的 Z 值
  4. 用 Z 值大的物体表面属性更新当前值
  5. 循环迭代,完成消隐

第49页:扫描线消隐算法

2.3.2 扫描线算法

  1. 置每一条扫描线上的所有像素深度为 −1,颜色为背景色
  2. 计算扫描线上在物体投影边界内每点的 Z 值
  3. 用 Z 值大的物体表面属性更新当前值
  4. 循环迭代,完成消隐

扫描线上的间隔按类型(如间隔1、间隔2)分别处理。

第50页:区域子分算法原理

2.3.3 区域子分算法:1) 原理 —— 沿投影方向构造投影柱,考察投影窗口与物体投影多边形的关系,逐层细分窗口。

第51页:窗口与投影多边形的关系

投影窗口与物体的投影多边形的关系

  1. (a) 投影多边形包围窗口
  2. (b) 投影多边形与窗口相交
  3. (c) 窗口包围投影多边形
  4. (d) 窗口与投影多边形分离

第52页:Warnock细分算法

Warnock 细分算法

  1. 所有多边形与窗口分离,窗口填充背景色
  2. 只有一个多边形与窗口相交,或者窗口包围多边形,先将窗口内全填背景色,再对窗口内多边形部分用扫描线算法进行填充
  3. 窗口中存在一个或多个多边形,但离视点最近者包围了窗口,将整个窗口填充该多边形规定的颜色
  4. 其它情况,将窗口一分为四,重复上述判断,直到不可再分

第53页:Warnock细分算法举例

Warnock 细分算法举例:窗口按上述规则不断一分为四,直到每个子窗口都能明确判定,子窗口中标注的数字表示填充该区域的多边形编号。

第54页:光线投射算法原理

2.3.4 光线投影算法:从绘图窗口的每个像素出发形成投影线,穿过场景中物体求交。

第55页:光线投射算法流程

光线投影算法流程

for (v = 0; v < v_max; v++)
 for (u = 0; u < u_max; u++) {
  形成通过像素 (u, v) 的投影线;
  for (场景中的每一个多边形) 将投影线与多边形求交;
  if (有交点) 以最远交点所属多边形的颜色显示像素 (u, v);
  else 以背景色显示像素 (u, v);
 }

第56页:光照技术的作用

3. 图形的光照技术:作用 —— 增强图形的真实感。

  • 无光照
  • 点光源
  • 综合光源

第57页:光源的类型

3.1 光源

发光光源(light emitting sources)
环境光、平行光、点光源、聚光源
反射光源(light reflecting sources)
漫反射(diffuse reflection)、镜面反射(specular reflection)

第58页:漫反射与朗伯余弦定律

3.1.1 漫反射(diffuse reflection):表面粗糙、无光泽 → 向各个不同方向做相同的散射,即亮度相同。

朗伯(Lambert)余弦定律:I = kd · Il · cosθ,0 ≤ θ ≤ π/2,kd 为漫反射系数(0 ≤ kd ≤ 1),与物体表面材料有关。

第59页:镜面反射

3.1.2 镜面反射(specular reflection):光滑表面的镜面反射光强取决于入射光的角度、波长和反射表面的材料性质等,几何光学中用菲涅耳(Fresnel A.J.)方程描述。

I = Il · ω(θ, λ) · cosⁿα;工程上常用常数 Rs 代替复杂的反射曲线 ω(θ, λ),即 I = Il · Rs · cosⁿα。

第60页:环境光与总光强

3. 环境光:环境光亮度均匀,通常由多个物体经多重反射形成,精确计算光强几乎不可能,一般处理为常数 I = Ia · ka。

4. 总光强:I = Ia·ka + Il(kd·cosθ + ks·cosⁿα);多个点光源时对各光源的贡献求和。

第61页:OpenGL光照设置

3.2 光照效果(OpenGL):光照效果 = 光源(强度、颜色)+ 材质反射(光强、颜色)。

GLfloat light0Ambient[] = {0.3f, 0.3f, 0.3f, 1.0f};
GLfloat light0Diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f};
float light0Pos[4] = {1, 1, 1, 0};
glLightfv(GL_LIGHT0, GL_AMBIENT, light0Ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light0Diffuse);
glLightfv(GL_LIGHT0, GL_POSITION, light0Pos);

第62页:光照处理的基本算法

3.3 光照处理的基本算法

恒定亮度法
整个面片用同一亮度
Gouraud 法
双线性光强插值法,先算顶点光强再插值
Phong 法
双线性法向插值法,先插值法向再计算光强,效果最好

第63页:OpenGL光照举例

3.4 举例(OpenGL):本页源文件仅保留小节标题,光照渲染效果图片建议对照原课件图片补充。

第64页:

第65页:纹理贴图

4. 纹理贴图

第66页:纹理贴图原理

4.1 纹理贴图原理(Texture mapping):将 2 维的光栅图像数据映射到三维空间表面。

  • 纹理坐标系 Q(s, t) → 三维空间 P(x, y, z)
  • 通过纹理坐标与顶点坐标的对应关系完成贴图

第67页:贴图的处理步骤

贴图的处理步骤

  1. 建立一个可覆盖被贴图对象的虚面
  2. 将贴图的图像数据贴到该虚面上
  3. 沿被贴图对象表面法矢方向延长一射线与贴图后的虚面相交,将该交点的颜色值作为被贴图对象表面上对应点的颜色值

OpenGL 设置:glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

第68页:OpenGL贴图举例

4.2 举例(OpenGL):以四边形为贴图对象,纹理坐标 (0,0)、(1,0)、(1,1)、(0,1) 分别对应顶点 (x1,y1,z1)、(x2,y2,z2)、(x3,y3,z3)、(x4,y4,z4)。

OpenTextureFile((LPCTSTR)texturefile);
glDisable(GL_COLOR_MATERIAL);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(0, 0, 10);
glTexCoord2f(1.0f, 0.0f); glVertex3f(10, 0, 10);
glTexCoord2f(1.0f, 1.0f); glVertex3f(10, 10, 10);
glTexCoord2f(0.0f, 1.0f); glVertex3f(0, 10, 10);
glEnd();
glDisable(GL_TEXTURE_2D);
glEnable(GL_COLOR_MATERIAL);

第69页:纹理重复贴图举例

4.2 举例(OpenGL):纹理重复:将纹理坐标由 1.0 改为 5.0,即可在同一表面上重复平铺五次。

glTexCoord2f(0.0f, 0.0f); glVertex3f(0, 0, 10);
glTexCoord2f(5.0f, 0.0f); glVertex3f(10, 0, 10);
glTexCoord2f(5.0f, 5.0f); glVertex3f(10, 10, 10);
glTexCoord2f(0.0f, 5.0f); glVertex3f(0, 10, 10);

第70页:窗口的概念

5.1.1 窗口:在用户空间中定义的确定显示内容的一个矩形区域,由左下角 (Wxl, Wyb) 与右上角 (Wxr, Wyt) 确定。

第71页:视区的概念

5.1.2 视区:用户在屏幕上定义的矩形区域,用于显示窗口中的图形。

第72页:窗口视区变换

5.1.3 窗口—视区变换

(xv − Vxl)/(Vxr − Vxl) = (xw − Wxl)/(Wxr − Wxl);(yv − Vyb)/(Vyt − Vyb) = (yw − Wyb)/(Wyt − Wyb)

[xv yv 1] = [xw yw 1] · [a 0 0; 0 d 0; b c 1],实现用户空间到屏幕空间的映射。

第73页:点的裁剪

5.2.1 点的裁剪:点 P(x, y) 满足 Wxl ≤ x ≤ Wxr 且 Wyb ≤ y ≤ Wyt 时可见,否则不可见。

第74页:直线段与窗口的关系

5.2.2 直线段的裁剪:1) 直线段与窗口的关系

  1. (1) 两端点在窗口内(c)
  2. (2) 两端点在窗口外且与窗口不相交(e、d)
  3. (3) 两端点在窗口外且与窗口相交(b)
  4. (4) 一点在内,一点在外(a)

第75页:直接求交裁剪法

2) 直接求交裁剪法

  1. 两端点均在窗口边界线外同侧,则不可见,舍去(如 d)
  2. 两端点均在窗口内,则可见,全部保留(如 c)
  3. 两端点一个在窗口内、一个在窗口外:计算该线段与窗口边界的交点,保留该交点至窗口内端点的部分线段,舍弃其余(如 a)
  4. 两端点均在窗口外:A) 线段穿越窗口,其与窗口边界线的两个交点均在窗口范围内,保留两交点连线部分(如 b);B) 交点均在窗口外,则全部舍去(如 e)

第76页:编码裁剪法

3) 编码裁剪法(Sutherland, 1974):将平面划分为九个区域,每个区域用一个四位代码表示;线段的端点在某区域时,便将该区域代码赋予该端点。

第一位:左;第二位:右;第三位:下;第四位:上。例如窗口内为 0000,左上角区域为 1001。

第77页:编码裁剪算法步骤

编码裁剪法的算法与判别

  1. 根据两端点所在的区域,赋予区域代码
  2. 两端点都为 0000,线段在窗内
  3. 两端点编码的对应位做位逻辑乘(按位与),结果非 0,线段在窗口外
  4. 否则,计算线段与窗口各边的交点,重复 (2)、(3)、(4)

第78页:中点分割裁剪算法

4) 中点分割裁剪算法

  1. (1) 线段全在窗口外?是,结束;否则
  2. (2) 线段在窗口内?是,返回;否则
  3. (3) 线段对分为二,重复 (1)、(2)、(3)

通过不断取中点 Pm 逼近线段与窗口边界的交点。

第79页:多边形的裁剪

5.2.3 多边形的裁剪:本页源文件仅保留小节标题,多边形裁剪的图示与算法说明建议对照原课件图片补充。

第80页:三维物体的显示流程

5.3 三维物体的显示流程

  1. 用户坐标系 (x, y, z) → 观察变换 → 观察坐标系 (xe, ye, ze)
  2. 剪裁变换 → 剪裁坐标系 (xc, yc, zc) → 三维剪裁
  3. 剪裁逆变换 → 观察坐标系
  4. 投影变换 → 视平面坐标系 (xp, yp)
  5. 开窗变换 → 屏坐标系 (xs, ys)

参考资料:任仲贵 主编《CAD/CAM原理》,清华大学出版社,1991.9。

第81页:OpenGL视口与投影设置

OpenGL 中的视口与投影设置

glLoadIdentity();
glViewport(0, 0, cx, cy);
glMatrixMode(GL_PROJECTION);
if (cx <= cy) { GLfloat ratio = (GLfloat)cy / (GLfloat)cx; glOrtho(m_XOrg, m_XMax, m_YOrg*ratio, m_YMax*ratio, −10000.0f, 10000.0f); }
else { GLfloat ratio = (GLfloat)cx / (GLfloat)cy; glOrtho(m_XOrg*ratio, m_XMax*ratio, m_YOrg, m_YMax, −10000.0f, 10000.0f); }

第82页:OpenGL显示流程代码

OpenGL 显示流程

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
auxSolidCube(20);

第83页:第4章思考题

思考题

  1. 如何理解基本图形变换和组合变换?
  2. 掌握组合变换矩阵的推导方法
  3. 进行消隐和提高消隐效率的方法
  4. 贴图的基本原理
  5. 什么是窗口和视口,为何要进行窗口视口变换?
  6. 为何要进行裁剪?方法有哪些?
顶部目录