页数:83页文件大小:1.28 MB来源: CADCAM技术基础ppt课件
本课件从图形的基本构成讲起,系统给出比例、对称、旋转、错切、平移与齐次变换矩阵,推导绕任意点与任意直线的组合变换,介绍投影变换分类,并讲解Z缓冲区、扫描线、区域子分与光线投射等消隐算法,以及光照、贴图与裁剪技术。
第4章 图形图像处理技术基础
第4章 图形图像处理技术基础
图形处理的内容:
1.1 引言:图形的基本构成 = 顶点坐标 + 拓扑关系。
图形变换的实质是点的变换:旧点(集)× 变换矩阵 →(矩阵运算)→ 新点(集),即 V* = V · T。
包括比例变换、对称变换、旋转变换、平移变换、投影变换等。
基础知识:向量、矩阵运算。
1.2.1 比例变换:x' = a·x,y' = d·y
[x' y'] = [x y] · [a 0; 0 d]
1.2.2 对称变换
综合矩阵:[x' y'] = [x y] · [a b; c d],其中 a、b、c、d 取不同值可实现比例、对称、错切、旋转等变换。
1.2.3 旋转变换:绕原点旋转 θ 角
[x' y'] = [x y] · [cosθ sinθ; −sinθ cosθ]
1.2.4 错切变换
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,即可得到平移变换。
1.2.6 齐次变换矩阵
T = [a b p; c d q; l m s]
1.2.7 组合变换:1) 绕任意点 p(xp, yp) 的旋转变换
(续)绕任意点的旋转变换
2) 绕任意直线 AB 的旋转变换(AB 的方程为 Ax + By + C = 0)
组合变换矩阵为:T = T1 · T2 · T3 · T4 · T5
OpenGL(Open Graphics Libraries)
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
三维比例变换: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);
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);
对 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);
对 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);
(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);
(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);
(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);
三维平移变换
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);
组合旋转时顺序对结果的影响
两种顺序得到的结果不同,说明矩阵乘法不满足交换律。
P 绕空间轴 AA' 旋转 θ 角至 P',求 P' 的坐标
其中 n = √(n1² + n2² + n3²),sinα = n2/n,cosα = n3/n,sinβ = n1/n,cosβ = n
绕空间任意轴旋转的 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();
多轴数控机床的运动变换
涉及床身、X/Y/Z 轴、B 轴、C 轴、刀具、夹具与工件。
1.4 三维图形的投影变换
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](由旋转矩阵与平移矩阵相乘得到)。
3) 侧面投影(侧视图):绕 z 轴旋转 90°,再沿 x 方向平移 −l。
TW = [0 0 0 0; 0 1 0 0; 0 0 1 0; −l 0 0 1](由旋转矩阵与平移矩阵相乘得到)。
轴测投影变换
变换矩阵由绕 z 轴旋转 γ 角与绕 x 轴旋转 α 角的两步矩阵相乘得到。
透视(中心)投影变换:以视距 d 为参数,变换矩阵为
T = [1 0 0 0; 0 1 0 0; 0 0 0 −1/d; 0 0 0 1]
点 P 经变换后得到透视投影坐标。
2.1 基本概念:图形的多义性 —— 同一幅线框图可以对应多种不同的三维形体解释,需要通过消隐加以明确。
消隐算法 1) 以窗口内的每个像素为处理单元:确定每一个像素处场景中 k 个物体哪个距离观察点最近(可见),以其颜色来显示该像素。
for (窗口中的每个像素) { 确定距视点最近的物体,以该物体表面的颜色显示像素;}
消隐算法 2) 以场景中的物体为处理单元:将一个物体与其余的 k−1 个物体逐一比较,仅显示可见的表面以达到消隐的目的。
for (场景中的每一个物体) { 将该物体与场景中的其它物体进行比较,确定其表面的可见部分;显示该物体表面的可见部分;} 通常用于线消隐。
提高消隐算法效率的方法
1) 重叠测试:用包容盒判断两个物体的投影是否重叠。
若 xAmax ≤ xBmin 或 xAmin ≥ xBmax,或 yAmax ≤ yBmin 或 yAmin ≥ yBmax,则两物体不可能重叠,无需进一步求交。
2) 包容性测试:判断点是否落在多边形内部。
3) 深度测试法:比较同一投影点上两个表面 P1、P2 对应的深度值,深度小者离视点近,遮挡深度大者。
4) 可见性测试:表面法矢 N 与视线向量 S 的点积 N · S = |N||S|cosθ。
平面方程可写为 ax + by + cz + d = 0。
2.3.1 Z 向深度缓冲区算法
2.3.2 扫描线算法
扫描线上的间隔按类型(如间隔1、间隔2)分别处理。
2.3.3 区域子分算法:1) 原理 —— 沿投影方向构造投影柱,考察投影窗口与物体投影多边形的关系,逐层细分窗口。
投影窗口与物体的投影多边形的关系
Warnock 细分算法
Warnock 细分算法举例:窗口按上述规则不断一分为四,直到每个子窗口都能明确判定,子窗口中标注的数字表示填充该区域的多边形编号。
2.3.4 光线投影算法:从绘图窗口的每个像素出发形成投影线,穿过场景中物体求交。
光线投影算法流程
for (v = 0; v < v_max; v++)
for (u = 0; u < u_max; u++) {
形成通过像素 (u, v) 的投影线;
for (场景中的每一个多边形) 将投影线与多边形求交;
if (有交点) 以最远交点所属多边形的颜色显示像素 (u, v);
else 以背景色显示像素 (u, v);
}
3. 图形的光照技术:作用 —— 增强图形的真实感。
3.1 光源
3.1.1 漫反射(diffuse reflection):表面粗糙、无光泽 → 向各个不同方向做相同的散射,即亮度相同。
朗伯(Lambert)余弦定律:I = kd · Il · cosθ,0 ≤ θ ≤ π/2,kd 为漫反射系数(0 ≤ kd ≤ 1),与物体表面材料有关。
3.1.2 镜面反射(specular reflection):光滑表面的镜面反射光强取决于入射光的角度、波长和反射表面的材料性质等,几何光学中用菲涅耳(Fresnel A.J.)方程描述。
I = Il · ω(θ, λ) · cosⁿα;工程上常用常数 Rs 代替复杂的反射曲线 ω(θ, λ),即 I = Il · Rs · cosⁿα。
3. 环境光:环境光亮度均匀,通常由多个物体经多重反射形成,精确计算光强几乎不可能,一般处理为常数 I = Ia · ka。
4. 总光强:I = Ia·ka + Il(kd·cosθ + ks·cosⁿα);多个点光源时对各光源的贡献求和。
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);
3.3 光照处理的基本算法
3.4 举例(OpenGL):本页源文件仅保留小节标题,光照渲染效果图片建议对照原课件图片补充。
4. 纹理贴图
4.1 纹理贴图原理(Texture mapping):将 2 维的光栅图像数据映射到三维空间表面。
贴图的处理步骤
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);
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);
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);
5.1.1 窗口:在用户空间中定义的确定显示内容的一个矩形区域,由左下角 (Wxl, Wyb) 与右上角 (Wxr, Wyt) 确定。
5.1.2 视区:用户在屏幕上定义的矩形区域,用于显示窗口中的图形。
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],实现用户空间到屏幕空间的映射。
5.2.1 点的裁剪:点 P(x, y) 满足 Wxl ≤ x ≤ Wxr 且 Wyb ≤ y ≤ Wyt 时可见,否则不可见。
5.2.2 直线段的裁剪:1) 直线段与窗口的关系
2) 直接求交裁剪法
3) 编码裁剪法(Sutherland, 1974):将平面划分为九个区域,每个区域用一个四位代码表示;线段的端点在某区域时,便将该区域代码赋予该端点。
第一位:左;第二位:右;第三位:下;第四位:上。例如窗口内为 0000,左上角区域为 1001。
编码裁剪法的算法与判别
4) 中点分割裁剪算法
通过不断取中点 Pm 逼近线段与窗口边界的交点。
5.2.3 多边形的裁剪:本页源文件仅保留小节标题,多边形裁剪的图示与算法说明建议对照原课件图片补充。
5.3 三维物体的显示流程
参考资料:任仲贵 主编《CAD/CAM原理》,清华大学出版社,1991.9。
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); }
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);
思考题
下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}