与观察坐标系

Download Report

Transcript 与观察坐标系

课程内容进展
综述
‘图形学’和‘图形系统’
建模
曲线曲面 实体造型
观察
观察流水线 裁剪
显示
可见面判别
其它
UI 动画 ……
光照 面绘制
坐标系统
基本图元
几何变换
第四讲 二维观察和三维观察
Two-Dimensional Viewing
Three-Dimensional Viewing
第四讲主要内容
二维观察
 OpenGL二维观察相关函数
 二维裁剪
———————————————————
 三维空间的观察过程
 投影
 OpenGL三维观察和裁剪相关函数
 三维裁剪

第四讲小结

二维观察流水线
–
–
几种坐标系之间的关系
裁剪窗口到视口的变换方法
矩形窗口的线段裁剪算法
 矩形窗口的多边形裁剪算法
——————————————————
 投影分类:



–
正平行、斜平行
–
对称透视、斜透视
理解各类投影变换的推导及其相互关系
理解三维空间的观察变换过程
练习题

编程:实现矩形窗口或多边形窗口删除功能。

编程:用OpenGL实现任意长方体的线框模型显示,并通过键盘控制视
点的移动(左右远近)来实现观察效果的改变。

设世界坐标系下Window由 (200,300) 和 (500,800) 两点给出,规范化设
备坐标系下Viewport 由 (0.1,0.1) 和 (0.7,0.4) 两点给出,屏幕分辨率为
1024 x 768, 屏幕上(240,600) 对应于Window中哪一坐标位置的点?
0
1023
767
World Coordinate
Normalized Device Coordinate
Screen Coordinate
End of 第四讲
二维观察

基本概念

二维观察流水线

关键的几何变换
基本概念
显示器屏幕

裁剪窗口:二维场
景(观察坐标系或世
界坐标系)中要显示
的部分
–

矩形或其它
视口:在输出设备
上进行观察的位置
–
矩形或其它
视口范围
程序窗口
裁剪窗口
二维观察变换流水线
MC
建
模
坐
标
系
建模
变换
WC
世
界
坐
标
系
观察
变换
VC
观
察
坐
标
系
规范化
和视口
变换
NDC
规设
范备
化坐
标
系
(1)二维坐标系变换
(2)裁剪
(3)裁剪后的场景映射到规范化视口
工作站
变换
DC
设
备
坐
标
系
流水线step1
WCy
定义观察坐标系
下的裁剪窗口
WCx
VCy
WCy
直接在世界
坐标系下变
换和裁剪
WCy
WCx
WCx
VCx
流水线step2
裁剪窗口
规范化视口
工作站
变换
裁剪窗口到视口的变换
裁剪窗口
规范化视口
裁剪窗口到视口的复合变换矩阵



平移
缩放
平移
T1 =
S=
T2 =
1 0 -xwmin
0 1 -ywmin
0 0 1
Sx 0 0
0 Sy 0
0 0 1
1 0 xvmin
0 1 yvmin
0 0 1
= T2 . S . T1
OpenGL几个关键的二维观察函数
//投影模式
glMatrixMode(GL_PROJECTION/GL_MODELVIEW);
glLoadIdentity();
显示器屏幕
//视口位置和尺寸(相对于程序窗口)
视口范围
glViewport (x, y, width, height);
Opengl程序窗口
//裁剪窗口函数
gluOrtho2D(xmin,xmax,ymin,ymax);
xmax,ymax
二维投影面范围
xmin,ymin
二维裁剪


基本概念
裁剪方法
点
– 线段
– 多边形
– 曲线
– 文字
–
裁剪的相关概念

裁剪:消除指定区域内(外)的图形部分

“指定区域”的边界类型:
– 矩形
– 多边形
– 圆
– 其它曲线
裁剪对象:
点, 线, 区域, 曲线, 文字


假设裁剪区域为正则矩形
点的裁剪


P(x, y)
W(xwmin, xwmax, ywmin, ywmax)
满足:
否则,P点被裁剪(不显示)
则,P点保留(显示)
线段的裁剪

Cohen-Sutherland 算法(CS)

中点分割裁剪法

Cyrus-Beck方法(CB)

梁友栋-Barsky 算法(梁B)

Nicholl-Lee-Nicholl 裁剪法(NLN)

非矩形窗口的裁剪
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
1001
1000
1010
0001
0000
0010
0101
0100
0110
因此,对于线段(p1,p2),有:
– 如果f(p1)=f(p2)=(0000)
线段完全保留
–
如果f(p1)&f(p2)(0000)
线段完全舍弃
–
其它情况:
需进一步判断和裁剪
Cohen-Sutherland 算法-求交




假定一个和窗口边界求交的
顺序:左、右、下、上
通过判断两个端点的区域码
在同一位上的值,可知和当
前边界有没有交点,并求之
舍弃窗口外的部分
余下子线段继续求交
中点分割裁剪

中点分割算法将Cohen_Sutherland算法
中求线段与窗口边界交点的过程用折半查
找的方法来代替。

相当于Cohen_Sutherland算法的硬件版
本,只需加法和移位,没有乘除法。
Cyrus-Beck方法
将线段表示成参数方程
的形式,求线段与窗口边
界的交点的参数
 确定线段的可见部分之
后再用交点的参数计算交
点的坐标。
 适用于矩形或凸多边形
裁剪窗口。
p1 /p0

p0
p1
外部
p1
入点
出点
p0
内部
p0 /p1
梁友栋-Barsky 线段裁剪法

线段的参数表示

判断线段上每一点的可见性:
梁-Barsky 法
1
u2
-ux  x0-xwmin
u4
ux  xwmax-x0
-uy  y0-ywmin
uy  ywmax-y0

因此,线段与矩形各
边的交点参数值为:
左,右,下,上 边界
k = 1, 2, 3, 4
u1
u3
0
梁-Barsky法:
非平行边求交

左
右
下
上
Pk<0:
–
从k边界外伸向内
–
交点存入数组{ 0, u1 }
1
u2
u4
u1

Pk>0:
–
–
u3
从k边界内伸向外
交点存入数组{ u2, 1 }
0
梁-Barsky法:非平行边求交(续)


max{u1} < min{u2} : 可见边
max{u1} ≥ min{u2} : 舍弃线段
梁-Barsky 法:平行边

Pk=0(线段平行于裁剪窗口边界)
–
–
qk<0 :整个线段舍弃
qk>=0 :按m边交点(mk,pm0)进行裁剪
P1=0
P2=0
q1<0
q2<0
Nicholl-Lee-Nicholl 线段裁剪法
先按照CS算法,确定完全
可见(不可见)的线段

其它线段(p1,p2),按p1的
位置分为三种情况(其它情况
可通过对称性得到) 。

(1)
(2)
T
LT
L
L
R
P1
LR
L
P1
L
B
LB
以p1为起点,与窗口四顶点连接得到分界射线
通过p2的区域码、线段斜率和分界射线斜率判断所属区域
和所属区域有关的裁剪窗口边界求交
P1
P1
T
L
L
LR
LB
T
TR
T
TR
L
LB
TB
多边形窗口的线段裁剪

凸多边形窗口:
–
–

Cyrus-Beck参数化方法,梁-Barskey扩充算法
如果是平行四边形,可错切得到矩形,裁剪,再错切回去
凹多边形窗口:
–
可分解成一组凸多边形
–
类似于扫描填充方法的裁剪:求交,判断是否在窗口内

加速:排除不相交边
Cyrus-Beck 凸多边形窗口线段裁剪


采用法线+点积的方法来判别点在窗口内/外。
凸多边形裁剪窗口上任一点A处的内、外法线的
定义如下(B为另一边上任意点):
–
–
内法线Ninner满足: Ni•(B-A)>0
外法线Nouter满足:
No•(B-A)<0
Cyrus-Beck 算法

直线段(P1,P2) 的参数方程为:
L(u)=(P2-P1)u+P1

u ∈[0,1]
对于线段上任意点L(u),裁剪窗口某边界WL上任一点A,
A处的内法线N,有三种可能:
–
N •(L(u)-A)<0,

–
N •(L(u)-A)=0,

–
则L(u)在WL外侧
则L(u)在WL或其延长线上
N •(L(u)-A)>0,

则L(u) 在WL内侧

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的推导?
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 }

最终:若umin  umax,则它们是可见线段的端点
参数,否则,线段不可见。
–
–
umin(0)代表沿P1 P2最后进入多边形的位置。
umax(1)代表沿P1 P2最早离开多边形的位置。
非线性边界窗口的线段裁剪

圆形窗口
–

不相交情况的排除

和圆的包围盒测试

圆心到线段距离测试
–
线段和圆的求交运算
–
圆的4/8对称性的利用
曲线边界窗口
附:国内发表的若干线裁剪文章









汪灏泓,一种基于几何变换的线裁剪新算法,软件学报, 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
多边形的裁剪

多边形的各条边分别使用“线条裁剪”方法
– 产生不闭合区域

分别用窗口的4边对多边形进行裁剪
– 需重新组织每个窗口边界上的多
边形顶点序列
假定边界处理顺序:左,右,下,上
Sutherland-Hodgeman算法

窗口四边分别对多边形各边进行裁剪

多边形L边被窗口WL边界裁剪,
顶点的修改方法:
–
舍弃L

–
–
L两端均在WL外
保留终点

L两端均在WL内

L从WL内伸向外(交点为新终点)
起点改变,则保留新起点和终点

L从WL外伸向内(交点为新起点)
WL
3
B
2
1
4
C
5
6
左裁剪
右裁剪
A
实现方法:
—串行
—并行(窗口各边并行
的对顶点序列进行裁剪)
下裁剪
上裁剪
A B
A B
B C
B 4
B 4
C A
5 A
4 5
4 5
5 6
5 6
5 6
1 B
6 1
6 1
1 B
1 2
B 4
3 4
4 5
Sutherland-Hodgeman算法

凹多边形裁剪后有多余边
Weiler-Atherton 算法

适用于任意多边形窗口裁剪任意多边形,
–
不会产生多余边
逆时针方向处理多边形:
(1)多边形的边L由内到外穿越窗口边界时:
逆时针沿窗口边界搜索下一个交点
(2)由外到内穿越时,
逆时针沿多边形边界搜索下一个交点
2
3
C
4
B
1
6
5
-A:重复(1)(2)步直到产生一个回路。
-B:回到上次A的起始交点,继续对多边形的其它边进
行A步骤。
A
Weiler-Atherton 算法
Weiler-Atherton 算法

逆时针(顺时针)维护多
边形/裁剪窗口顶点序列

内-外测试:顶点是否在
对方范围内
曲线的裁剪



圆
–
和圆的包围盒测试
–
4分或8分象限的包围盒测试
–
窗口边界和圆求交得到圆弧
其它曲线
–
包围盒测试
–
求交
边扫描转换边裁剪
–
逐个象素判断是否在裁剪窗口内
文字的裁剪
精确到字符串
精确到字符
精确到笔划
轮廓字体:线条裁剪
位图字体:象素判断
裁剪前
裁剪后
三维空间的观察过程

与三维观察有关的若干概念

三维观察流水线

三维观察坐标系及其转换
三维观察相关概念

对象指定位置视图投影到显示设备
投影(3D
to

投影(3D
2D):平行投影、透视投影
to 2D):平行投影、透视投影 图
深度关系(可见线、面的标识)

深度关系(可见线、面的标识) 图
线:近亮、远暗/不显示/虚线显示/不同颜色显示
–
线:近亮、远暗/不显示/虚线显示/不同颜色显示
面:屏幕象素仅包含前向面的颜色
–
面:屏幕象素仅包含前向面的颜色

对象表面特征视图

面绘制:光照、透明/光滑性、纹理
面绘制:光照、透明/光滑性、纹理

内部组成或剖面

拆散和剖切显示
拆散和剖切显示

图
立体显示

左、右视图(立体眼镜)
左、右视图(立体眼镜)
图
三维观察流水线
MC
建
模
坐
标
系
建模
变换
WC
世
界
坐
标
系
观察
变换
三维






指定观察参数以及投影类型
投影变换(获得:2D+z)
规范化观察体 View Volume
裁剪
视口变换
可见性判断、表面绘制等
VC
观
察
坐
标
系
三维
投影,
规范化,
裁剪
PC,NC
投
影
坐
标
系
规
范
化
坐
标
系
视口
变换
DC
设
备
坐
标
系
包含深度信息的二维
三维观察坐标系
在三维世界坐标系中:
指定观察参考点 P
V’
N
指定观察平面法向量 N (z轴)
指定和调整观察向上向量 V (y轴)
V
U
计算出向量 U (x轴)
P
观察平面
由此,获得uvn观察坐标参考系统
——站在P点,沿着N(-N)方向看,在UV平面上‘看’到的内容
三维观察变换(世界->观察坐标系)
T=
1
0
0
0
0
1
0
0
0 -x0
0 -y0
1 -z0
0 1
Uux
Vuy
Nuz
复合变换 P’=R·T·P
三维观察效果
– 固定观察点P,改变N的方向
– 固定N的方向,改变观察点P位置
问题:如何在输出设备上获得这些效果?
核心:三维模型向观察平面投影!
投影

如何将三维场景显示在二维的设备上

投影的分类
各类投影相应的观察体
实现各类投影的几何变换方法


投影的分类


从三维物体上某点P引出的一条射线(投影线)
与观察平面的交点,即为P的投影点。
正投影
分类
正平行投影
平行投影
斜平行投影
投
影
透视投影
一点透视投影
二点透视投影
三点透视投影
正轴测投影
等轴测投影
斜等测
斜二测
投影示意简图
平行投影
投影线相互平行
透视投影
投影线会聚到一点:“投影中心”
投影线相互平行 &
投影线与观察平面垂直
正平行投影
(正,正轴测,等轴测)

正投影:投影平面垂直于世界坐标系下某一坐标轴
–
平行性不变
尺寸比例不变
–
三维结构
–
正投影
重建
三视图
正轴测投影

正轴测:
–
投影平面不垂直于任一坐标轴
–
线的平行性不变
–
包括正等测(等轴测)、正二测、正三测

等轴测: 投影平面和三根坐标轴交点离
1
原点的距离相等(|a|=|b|=|c| 八种)
1
1
正轴测投影示意图
1
1
1
为紫色平面
建立一个原
点和世界坐
标系原点重
合的观察坐
标系
世界
正投影的观察体定义及其规范化
对于观察平面平行于xy平面的正投影:




xp=x,yp=y,zp=z(所有投影变换均需保留z为可见性测试使用)
选择二维裁剪窗口:位于观察平面上
指定近-远裁剪平面:获得矩形管道观察体。
观察体的规范化变换。
规范化
平移,缩放
正投影的观察体定义及其规范化
规范化
平移,缩放

左手系
–
–
–
与通常的屏幕坐标系吻合
观察方向为正Znorm轴方向
可以将观察方向的正距离解释为离屏幕(观察平面)的距离

Znorm值越大,表示离观察平面越远
1
-1
1
-1
= T2 . S . T1
斜平行投影
投影线相互平行 &
投影线与观察平面不垂直
L=(x,y,z)(xp,yp,z)
H=x轴正向
 为L逆时针与H的夹角
L

L
H

x,y,z
0-90
 = 0-360
L
L
(
)
时为正投影
斜等测、斜二测

斜等测投影
–
投影平面与某一坐标轴垂直
–
tan=1  =45°  =任意
特点:与投影平面垂直的线投影后长度不变

斜二测投影
–
投影平面与某一坐标轴垂直
–
tan=2  =63.4°  =任意
特点:该轴轴向变形系数为 1/2

tan=2  =45
y
x
z
45
长长1
45
长长2
长长2
45
45
斜二测投影示意图
斜等测投影示意图
斜平行投影的观察体定义及其规范化
对于观察平面平行于xy平面的斜平行投影:





定义斜平行投影向量:获得投影变换矩阵
选择二维裁剪窗口:位于观察平面上
指定近-远裁剪平面:获得斜平行管道观察体
进行投影变换:获得与正投影相同的矩形管道观察体
观察体的规范化变换。(同正投影)
斜平行投影向量
斜平行投影变换矩阵
参考z=Zvp平面的关于z轴的错切
正投影变换矩阵
就是单位矩阵
单位投影向量
(0,0,1)
ort
斜平行投影观察体
y
x
Vp
z
斜平行投影观察体的变换
斜平行投影变换Moblique
规范化
(同正投影)
任意平行投影的变换过程
(1)坐标系变换:世界坐标系经变换,与观察
坐标系(右手或左手系)重合
此时:投影平面变为Z=0(XY平面)
(2)错切: Moblique 使斜平行投影变成正投影
(3)规范化(平移,缩放): Mortho norm
透视投影
投影参考点
(投影中心)

透视投影的特点:
–
–
–

“近大远小”:线段投影缩小程度与投影平面位置的关系
不平行于投影平面的平行线段组,投影后仍平行。
不平行于投影平面的平行线段组,投影后会聚。
投影中心无限远离投影平面时,即等同于平行投影
透视投影分类(灭点Vanishing point)
y


每组平行线条的会聚点称为一个“灭点”
主灭点:这组平行线条平行于某个坐标轴
–
–
–
一点透视 :投影平面只与一个坐标轴相交
二点透视 :投影平面只与二个坐标轴相交
三点透视 :投影平面只与三个坐标轴相交
z
透视投影的观察体定义及其规范化
对于观察平面平行于xy平面的透视投影:


定义投影中心
定义观察体
–
选择观察体类型并获得相应的投影变换矩阵
–
选择二维裁剪窗口:位于观察平面上
指定近-远裁剪平面
–


进行投影变换:获得矩形管道观察体
观察体的规范化变换。
约定1:投影平面平行于xy
平面(只与z轴相交),且
其法向量平行于Z轴正向。
思考:经过透视投影后任意点P的z坐标都变换成Zvp了吗?
透视投影变换
【注意:】
 ZprpZ(投影平面上的
对象点无需投影)
 每个对象点的h值均不同,
是z的线性函数
【思考:】
 Zp是什么?
透视投影变换矩阵
xh
x
yh
y
zh
z
h
1
Mpers
/h

Zh=sz·z + tz

Zp =Zh / h

因此,Zp Zvp而是对Z进行规范化! 代表了真正深度信息!

矩阵元素sz和tz用于实现z坐标规范化,其取值依赖于:
–
观察体的形状、位置、尺寸
–
规范化目标的大小:(0,1)还是(-1,1)
透视投影观察体

视觉棱锥体(类似于人眼的视觉圆锥体)

棱台:
–
–
–
裁剪窗口:位于投影平面上
近裁剪平面:去除大对象
远裁剪平面:去除小对象
棱台观察体
约定2:裁剪平面在
投影中心和观察对象
之间。
约定3:近裁剪平面
在投影中心和远裁剪
平面之间。
投影后可能过小
而难以辨别
投影后可能过大
而难以辨别
透视投影观察体的种类

对称透视投影棱台
–
投影中心到裁剪窗口
中心的连线垂直于投
影平面

斜透视投影棱台
对称棱台观察体
定义方法:
投影中心位置+远近裁剪面Z坐标
+裁剪窗口尺寸+Zvp/视场角


作用
–
是规范化和裁剪的依据
对称棱台观察体
从而计算出Zvp
对称透视观察体的变换示意图
透视变换
斜棱台观察体

约定:投影中心为原点,
投影平面就是近裁剪平
面
z
xwmin
ywmin~ywmax
znear
xwmax
ywmin~ywmax
znear
z
远裁剪面
投影中心
(0,0,0)
经过错切
后,xy坐
x
标变化,
z不变
投影中心
(0,0,0)
x
斜棱台错切成对称棱台示意图
y
y
z
x
x
z
约定前提下的斜对称透视变换
注意:不符合约定前提
时,可能需进行更多的
变换如平移等,相应错
切参数也需重新计算。
透视变换的含义
非对称透视
观察体
斜平行投影
观察体
对称透视
观察体
非对称透视
观察体
对称透视
观察体
正投影
观察体
错切
规范化
规范化
观察体
错切Mzshear
正投影
观察体
规范化
规范化
观察体
透视投影的规范化

经过前面的错切和透视变换
– z轴已经垂直于投影平面且穿越窗口中心
– 已获得齐次投影坐标
– 已获得矩形管道观察体
透视投影的规范化(续)

此时假定左手规范化
坐标系如右图所示:
–
–
sz,tz可求出
只需再考虑x、y方向
上的缩放即可。
(Sz·Z+tz)/(h)[-1,1]
Sz·Zfar+tz = 1 · hmax = zprp-zfar
Sz·Znear+tz = -1 · hmin = znear-zprp
另外,在错切之前,需考虑坐标系变换的问题:将世界坐标系下的任
意观察坐标系(投影平面及其法向量),变换到前述的简单情况。

相对于规范化观察空间的裁剪
裁剪平面:规范化立方体的六个面
在齐次坐标下进行裁剪
–
–
线条:CB或梁B算法
多边形:包围盒(球)测试、对对象各表面的顶点表采用二
维裁剪的方法。逐步修改表面的顶点表、获得新的表面顶点
表、修改共享边信息等等。
任意裁剪平面


给出平面方程
处理各对象每个表
面的顶点(边)
–

求解交点参数
最终将场景切割为
两个部分并获得剖
切位置视图
我们获得了什么?

对象的三维坐标
–
–
–

x和y是落在观察平面上的坐标
–

经过投影变换的
经过规范化变换的
经过裁剪的
视口范围内
z是深度信息
OpenGL三维观察函数

思考:平行/透视投影用什么方式实现缩放?
–
–
平行投影:几何变换,视口尺寸改变
透视投影:几何变换,视口尺寸改变,视点位置改变