1 / 99

课程内容进展

课程内容进展. 综述. ‘ 图形学’和‘图形系统’. 建模 观察 显示. 曲线曲面 实体造型. 坐标系统. 基本图元. 观察流水线 裁剪. 几何变换. 可见面判别 光照 面绘制. 其它. UI 动画 ……. 第四讲 二维观察和三维观察. Two-Dimensional Viewing Three-Dimensional Viewing. 第四讲主要内容. 二维观察 OpenGL 二维观察相关函数 二维裁剪 ——————————————————— 三维空间的观察过程 投影

venus
Download Presentation

课程内容进展

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 课程内容进展 综述 ‘图形学’和‘图形系统’ • 建模 • 观察 • 显示 曲线曲面 实体造型 坐标系统 基本图元 观察流水线 裁剪 几何变换 可见面判别 光照 面绘制 • 其它 UI 动画 ……

  2. 第四讲 二维观察和三维观察 Two-Dimensional Viewing Three-Dimensional Viewing

  3. 第四讲主要内容 • 二维观察 • OpenGL二维观察相关函数 • 二维裁剪 ——————————————————— • 三维空间的观察过程 • 投影 • OpenGL三维观察和裁剪相关函数 • 三维裁剪

  4. 第四讲小结 • 二维观察流水线 • 几种坐标系之间的关系 • 裁剪窗口到视口的变换方法 • 矩形窗口的线段裁剪算法 • 矩形窗口的多边形裁剪算法 —————————————————— • 投影分类: • 正平行、斜平行 • 对称透视、斜透视 • 理解各类投影变换的推导及其相互关系 • 理解三维空间的观察变换过程

  5. 练习题 • 编程:实现矩形窗口或多边形窗口删除功能。 • 编程:用OpenGL实现任意长方体的线框模型显示,并通过键盘控制视点的移动(左右远近)来实现观察效果的改变。 • 设世界坐标系下Window由 (200,300) 和 (500,800) 两点给出,规范化设备坐标系下Viewport 由 (0.1,0.1) 和 (0.7,0.4) 两点给出,屏幕分辨率为1024 x 768, 屏幕上(240,600) 对应于Window中哪一坐标位置的点? World Coordinate Normalized Device Coordinate Screen Coordinate 1023 0 767

  6. End of 第四讲

  7. 二维观察 • 基本概念 • 二维观察流水线 • 关键的几何变换

  8. 基本概念 • 裁剪窗口:二维场景(观察坐标系或世界坐标系)中要显示的部分 • 矩形或其它 • 视口:在输出设备上进行观察的位置 • 矩形或其它 显示器屏幕 视口范围 程序窗口 裁剪窗口

  9. 二维观察变换流水线 规范化和视口变换 建模 变换 观察 变换 工作站 变换 MC WC VC NDC DC 世界坐标系 观察坐标系 设备坐标系 建模坐标系 规范化 设备坐标系 (1)二维坐标系变换 (2)裁剪 (3)裁剪后的场景映射到规范化视口

  10. 流水线step1 WCy 直接在世界坐标系下变换和裁剪 定义观察坐标系下的裁剪窗口 WCx VCy WCy WCy WCx WCx VCx

  11. 流水线step2 裁剪窗口规范化视口 工作站变换

  12. 裁剪窗口到视口的变换 裁剪窗口 规范化视口

  13. = T2. S . T1 裁剪窗口到视口的复合变换矩阵 • 平移 • 缩放 • 平移 1 0 -xwmin 0 1 -ywmin 00 1 T1 = Sx 0 0 0 Sy 0 0 0 1 S = 1 0 xvmin 0 1 yvmin 00 1 T2 =

  14. OpenGL几个关键的二维观察函数 //投影模式 glMatrixMode(GL_PROJECTION/GL_MODELVIEW); glLoadIdentity(); //视口位置和尺寸(相对于程序窗口) glViewport (x, y, width, height); //裁剪窗口函数 gluOrtho2D(xmin,xmax,ymin,ymax); 显示器屏幕 视口范围 Opengl程序窗口 xmax,ymax 二维投影面范围 xmin,ymin

  15. 二维裁剪 • 基本概念 • 裁剪方法 • 点 • 线段 • 多边形 • 曲线 • 文字

  16. 裁剪的相关概念 • 裁剪:消除指定区域内(外)的图形部分 • “指定区域”的边界类型: • 矩形 • 多边形 • 圆 • 其它曲线 • 裁剪对象: 点, 线, 区域, 曲线, 文字 • 假设裁剪区域为正则矩形

  17. 点的裁剪 • P(x, y) • W(xwmin, xwmax, ywmin, ywmax) 则,P点保留(显示) 满足: 否则,P点被裁剪(不显示)

  18. 线段的裁剪 • Cohen-Sutherland 算法(CS) • 中点分割裁剪法 • Cyrus-Beck方法(CB) • 梁友栋-Barsky 算法(梁B) • Nicholl-Lee-Nicholl 裁剪法(NLN) • 非矩形窗口的裁剪

  19. 1001 1000 1010 0001 0000 0010 0101 0100 0110 Cohen-Sutherland 算法 • W(xmin,xmax,ymin,ymax) • 点p(x,y)的二进区域码f(p)=(TBRL) • if y>ymax 则:T=1,否则:T=0 • if y<ymin 则:B=1,否则:B=0 • if x>xmax 则:R=1,否则:R=0 • if x<xmin 则:L=1,否则:L=0 • 因此,对于线段(p1,p2),有: • 如果f(p1)=f(p2)=(0000)线段完全保留 • 如果f(p1)&f(p2)(0000)线段完全舍弃 • 其它情况: 需进一步判断和裁剪

  20. Cohen-Sutherland 算法-求交 • 假定一个和窗口边界求交的顺序:左、右、下、上 • 通过判断两个端点的区域码在同一位上的值,可知和当前边界有没有交点,并求之 • 舍弃窗口外的部分 • 余下子线段继续求交

  21. 中点分割裁剪 • 中点分割算法将Cohen_Sutherland算法中求线段与窗口边界交点的过程用折半查找的方法来代替。 • 相当于Cohen_Sutherland算法的硬件版本,只需加法和移位,没有乘除法。

  22. Cyrus-Beck方法 外部 p1 /p0 • 将线段表示成参数方程的形式,求线段与窗口边界的交点的参数 • 确定线段的可见部分之后再用交点的参数计算交点的坐标。 • 适用于矩形或凸多边形裁剪窗口。 p1 p0 入点 p0 出点 p1 内部 p0 /p1

  23. 梁友栋-Barsky 线段裁剪法 • 线段的参数表示 • 判断线段上每一点的可见性:

  24. 梁-Barsky 法 1 u2 • 因此,线段与矩形各边的交点参数值为: -ux  x0-xwmin u4 ux  xwmax-x0 u1 -uy  y0-ywmin u3 uy  ywmax-y0 0 左,右,下,上 边界 k = 1, 2, 3, 4

  25. 右 下 上 梁-Barsky法: 非平行边求交 • Pk<0: • 从k边界外伸向内 • 交点存入数组{ 0, u1 } 1 u2 u4 u1 • Pk>0: • 从k边界内伸向外 • 交点存入数组{ u2, 1 } u3 0

  26. 梁-Barsky法:非平行边求交(续) • max{u1} < min{u2} : 可见边 • max{u1} ≥ min{u2} : 舍弃线段

  27. 梁-Barsky 法:平行边 • Pk=0(线段平行于裁剪窗口边界) • qk<0 :整个线段舍弃 • qk>=0 :按m边交点(mk,pm0)进行裁剪 P1=0 P2=0 q1<0 q2<0

  28. Nicholl-Lee-Nicholl 线段裁剪法 • 先按照CS算法,确定完全可见(不可见)的线段 • 其它线段(p1,p2),按p1的位置分为三种情况(其它情况可通过对称性得到) 。

  29. (1) T LT (2) L L L R LR P1 P1 L B LB • 以p1为起点,与窗口四顶点连接得到分界射线 • 通过p2的区域码、线段斜率和分界射线斜率判断所属区域 • 和所属区域有关的裁剪窗口边界求交 P1 P1 T T TR L T TR L L LR LB LB TB

  30. 多边形窗口的线段裁剪 • 凸多边形窗口: • Cyrus-Beck参数化方法,梁-Barskey扩充算法 • 如果是平行四边形,可错切得到矩形,裁剪,再错切回去 • 凹多边形窗口: • 可分解成一组凸多边形 • 类似于扫描填充方法的裁剪:求交,判断是否在窗口内 • 加速:排除不相交边

  31. Cyrus-Beck 凸多边形窗口线段裁剪 • 采用法线+点积的方法来判别点在窗口内/外。 • 凸多边形裁剪窗口上任一点A处的内、外法线的定义如下(B为另一边上任意点): • 内法线Ninner满足: Ni•(B-A)>0 • 外法线Nouter满足: No•(B-A)<0

  32. Cyrus-Beck 算法 • 直线段(P1,P2) 的参数方程为: L(u)=(P2-P1)u+P1 u ∈[0,1] • 对于线段上任意点L(u),裁剪窗口某边界WL上任一点A,A处的内法线N,有三种可能: • N •(L(u)-A)<0, • 则L(u)在WL外侧 • N •(L(u)-A)=0, • 则L(u)在WL或其延长线上 • N •(L(u)-A)>0, • 则L(u)在WL内侧

  33. L(u)在凸多边形内(含边界上)的充要条件是:对于凸多边形各个边界上的任意一点A和该处内法向量N,都有L(u)在凸多边形内(含边界上)的充要条件是:对于凸多边形各个边界上的任意一点A和该处内法向量N,都有 • N •(L(u)-A) 0 • 因此:假设多边形有m条边,在每条边上取一个点Ai,和该点处的内法线Ni,则可见线段的参数区间为下列一组不等式的解: Ni•(L(u)-Ai)  0 (i=1~m) u ∈[0,1] 该解的最小值umin和最大值umax对应于可见线段的端点 umin和umax的推导?

  34. Ni•(L(u)-Ai)  0 Ni•((P2-P1) u +P1-Ai)  0  Ni•(P2-P1) u +Ni •(P1-Ai)  0 (=0时,u代表交点参数) • 平行边:对于某个i,有Ni•(P2-P1)=0,无交点。则: • 线段在区域外侧: Ni •(P1-Ai) <0:舍弃 • 线段和区域边界重叠: Ni •(P1-Ai) =0:通过端点测试得到可见段 • 线段在区域内侧:Ni •(P1-Ai)>0:继续和窗口其它边测试 • 非平行边,则可见部分的参数u满足: u  -ui, 当Ni •(P2-P1)>0线段从外到内穿过 i 边界 u  -ui, 当Ni •(P2-P1)<0线段从内到外穿过 i 边界 【注意】这里的ui = Ni•(P1-Ai) / Ni•(P2-P1) • 因此:解的最小值和最大值为: umin = max{0, max{ -ui: Ni •(P2-P1)>0 } umax = min{1, min{ -ui: Ni •(P2-P1)<0 }

  35. 最终:若umin umax,则它们是可见线段的端点参数,否则,线段不可见。 • umin(0)代表沿P1 P2最后进入多边形的位置。 • umax(1)代表沿P1 P2最早离开多边形的位置。

  36. 非线性边界窗口的线段裁剪 • 圆形窗口 • 不相交情况的排除 • 和圆的包围盒测试 • 圆心到线段距离测试 • 线段和圆的求交运算 • 圆的4/8对称性的利用 • 曲线边界窗口

  37. 附:国内发表的若干线裁剪文章 • 汪灏泓,一种基于几何变换的线裁剪新算法,软件学报, 1998, 9(10), pp728-733. • 刘勇奎.一个有效的多边形窗口的线裁剪算法.计算机学报, 1999, 22(11):1209~1214. • 蔡 敏, 一种快速的圆形窗口裁剪算法, 计算机辅助设计与图形学学报,2001, 13(12):63-67. • 唐彩云,改进的NLN直线裁剪算法,计算机应用与软件, 2002 Vol.19 No.9 P.41-42 • 陆国栋 .基于顶点编码的多边形窗口线裁剪高效算法.计算机学报,2002,25(9):987~993. • 李建华,基于多步法绘制理论的抛物线裁剪算法 广西科学院学报 2003 Vol.19 No.4 P.154-158 • 黄文钧,免解二次方程的圆形窗口裁剪算法 广西科学院学报 2003 Vol.19 No.4 P.159-161,164 • 袁红亮 .一种快速的圆形窗口线裁剪算法.计算机工程与应用 2004.21 • 李伟青,基于扫描带的任意多边形窗口线裁剪算法  工程图学学报 2005 Vol.26 No.2 P.35-40

  38. 多边形的裁剪 • 多边形的各条边分别使用“线条裁剪”方法 • 产生不闭合区域 • 分别用窗口的4边对多边形进行裁剪 • 需重新组织每个窗口边界上的多边形顶点序列 假定边界处理顺序:左,右,下,上

  39. WL Sutherland-Hodgeman算法 • 窗口四边分别对多边形各边进行裁剪 • 多边形L边被窗口WL边界裁剪,顶点的修改方法: • 舍弃L • L两端均在WL外 • 保留终点 • L两端均在WL内 • L从WL内伸向外(交点为新终点) • 起点改变,则保留新起点和终点 • L从WL外伸向内(交点为新起点)

  40. B 3 2 实现方法: —串行 —并行(窗口各边并行的对顶点序列进行裁剪) 1 4 C A 5 6 上裁剪 右裁剪 下裁剪 左裁剪 A B A B B 4 B C B 4 4 5 4 5 5 A C A 5 6 5 6 5 6 6 1 6 1 1 B 1 B 1 2 B 4 3 4 4 5

  41. Sutherland-Hodgeman算法 • 凹多边形裁剪后有多余边

  42. Weiler-Atherton 算法 • 适用于任意多边形窗口裁剪任意多边形, • 不会产生多余边 逆时针方向处理多边形: (1)多边形的边L由内到外穿越窗口边界时: 逆时针沿窗口边界搜索下一个交点 (2)由外到内穿越时, 逆时针沿多边形边界搜索下一个交点 -A:重复(1)(2)步直到产生一个回路。 -B:回到上次A的起始交点,继续对多边形的其它边进行A步骤。 B 2 1 3 6 C A 4 5

  43. Weiler-Atherton 算法

  44. Weiler-Atherton 算法 • 逆时针(顺时针)维护多边形/裁剪窗口顶点序列 • 内-外测试:顶点是否在对方范围内

  45. 曲线的裁剪 • 圆 • 和圆的包围盒测试 • 4分或8分象限的包围盒测试 • 窗口边界和圆求交得到圆弧 • 其它曲线 • 包围盒测试 • 求交 • 边扫描转换边裁剪 • 逐个象素判断是否在裁剪窗口内

  46. 文字的裁剪 精确到字符串 精确到字符 精确到笔划 轮廓字体:线条裁剪 位图字体:象素判断 裁剪后 裁剪前

  47. 三维空间的观察过程 • 与三维观察有关的若干概念 • 三维观察流水线 • 三维观察坐标系及其转换

  48. 三维观察相关概念 • 对象指定位置视图投影到显示设备 投影(3D to 2D):平行投影、透视投影 深度关系(可见线、面的标识) 线:近亮、远暗/不显示/虚线显示/不同颜色显示 面:屏幕象素仅包含前向面的颜色 • 对象表面特征视图 面绘制:光照、透明/光滑性、纹理 • 内部组成或剖面 拆散和剖切显示 • 立体显示 左、右视图(立体眼镜) • 投影(3D to 2D):平行投影、透视投影 图 • 深度关系(可见线、面的标识) 图 • 线:近亮、远暗/不显示/虚线显示/不同颜色显示 • 面:屏幕象素仅包含前向面的颜色 • 面绘制:光照、透明/光滑性、纹理 图 • 拆散和剖切显示 图 • 左、右视图(立体眼镜)

More Related