Transcript 第九讲

课程内容进展
综述
‘图形学’和‘图形系统’
建模
曲线曲面 实体造型
观察
三维观察流水线
显示
可见面判别
其它
UI 动画 ……
光照 面绘制
坐标系统,观察
图元绘制,裁剪
几何变换
图形绘制
第9讲 三维观察
Three-Dimensional Viewing
第9讲主要内容




三维空间的观察过程
投影
三维裁剪
OpenGL三维观察和裁剪相关函数
第9讲小结

观察流水线: 3维变2维 + 裁剪

普通显示: 真实或虚拟(3/2维)场景通过流
水线完成转换和显示

其它更“高级”的显示方式?
立体显示?增强现实?虚拟现实?




Stereo Display
Augment Reality
Virtual Reality
– 虚拟的三维场景(建模获得)通过观察流水线处理进行普通
显示,再通过特殊设备(如立体眼镜,立体屏幕)辅助让人
感受三维
– 沉浸感(真实性),交互性,构想
– 硬件:传感器,显示器,处理器,交互设备
 头盔,手套,衣服(身体部位跟踪)
– 软件:建模,实时3D计算,与CV的结合
《三体》
虚拟现实——桌面式

通常以观看为主要目的,且直接以普通的PC
为基础计算机硬件设备,配合简单的数据手套
或空间跟踪球等交互设备,让用户观察三维场
景并做交互。
虚拟现实——沉浸式

与桌面式类似,但采用的显示方式(设备)更
为复杂、交互方式(设备)更为全面,用户的
沉浸感更好。
虚拟现实——增强式(增强现实)

显示和虚拟物体的融合和交互。真实的三维场景(摄像获得)通
过摄像机设备处理变为二维图像帧,加上虚拟的三维场景,二者
共同通过观察流水线处理,最终合并进行普通显示或3D观察
– Google眼镜
虚拟现实——分布式

网络分布式虚拟现实将分散的虚拟现实系统或仿真器
通过网络联结起来,采用协调一致的结构、标准、协
议和数据库,形成一个在时间和空间上互相耦合的虚
拟,合成环境,参与者可自由地进行交互作用。
三维立体显示

基于双目视差原理的三维立体显示
– 眼镜/头盔式立体显示
 被动式偏光(涂层)设计:
–
RealD 3D、MasterImage 3D、杜比3D
– 240HZ以上的显示器。
 主动式快门设计
–
–
120HZ以上的显示器。
光栅式自由立体显示
 在合适的位置上观看
被动式

被动式:利用光线有“振动方向”的原理来分解原始图像,通过
在显示屏幕上加放偏光板,可以向观看者输送两幅偏振方向不同
的两幅画面,当画面经过偏振眼镜时,由于偏光式眼睛的每只镜
片只能接受一个偏振方向的画面,这样人的左右眼就能接收两组
画面,再经过大脑合成立体影像。
主动式

把图像按帧一分为
二,形成对应左眼
和右眼的两组画面
,持续交织显示出
来,同时红外信号
发射器将同步把持
快门式3D眼镜的左
右镜片开关,使左
、右双眼能够在准
确的时刻看到相应
画面。
自由式

观察者不需要佩戴任何观察仪器就可以直接看见3D图像。合成
的图像包含竖直的交替排列的图像条纹,这些条纹由具有位差的
左图像和右图像构成,通过在液晶显示屏上排列颜色过滤器来显
示合成图像。
– 索尼、夏普、康佳等裸眼3D电视
近期推出的产品




Oculus Rift、
HTC Vive 、
索尼Project Morpheus
三星Gear VR、
有趣的廉价设备

在2015年的开发者大会上,Google推出了自己家的VR虚拟现实
眼镜。Google Cardboard。其中很关键是一个道具就是
Google Cardboard应用。它可以将手机里的内容进行分屏显示
,两只眼睛看到的内容有视差,从而产生立体效果。通过使用手
机摄像头和内置的螺旋仪,在移动头部时能让眼前显示的内容也
会产生相应变化。
全息影像立体显示



拍摄:被摄物体在激光辐照下形成物光束;另一部分激光作为参考
光束射到全息底片上,和物光束叠加产生干涉,干涉情况反映物
体光波的全部信息:全息照片;
成象:全息图如一个复杂的光栅,在相干激光照射下的衍射光波再
现的图像立体感强,具有真实的视觉效应。
180度全息投影、270度全息投影、360度全息投影和舞台全息幻
影成像、展示幻影成像、空气雾幕成像等
相关应用——汽车制造


1比1的仿真感受
动态实时交互,
改变配色、轴距
、背景以及查看
细节特征结构。
从多个角度全面
观察,并实时进
行调整
相关应用——汽车制造

在汽车内部的人机
交互部件设计。包
括座椅、转向盘、
变速杆、指示灯、
后视镜、刮水器、
车门手柄、多媒体
娱乐以及空调等都
可以利用虚拟现实
技术进行效果模拟
支撑技术——GTX1080

比GeForce GTX 980,TITAN X更强大
支撑技术——GTX1080
End of 第9讲
三维空间的观察过程

与三维观察有关的若干概念

三维观察流水线

三维观察坐标系及其转换
三维观察相关概念

对象指定位置视图投影到显示设备
投影(3D
to

投影(3D
2D):平行投影、透视投影
to 2D):平行投影、透视投影 图
深度关系(可见线、面的标识)

深度关系(可见线、面的标识) 图
线:近亮、远暗/不显示/虚线显示/不同颜色显示
–
线:近亮、远暗/不显示/虚线显示/不同颜色显示
面:屏幕象素仅包含前向面的颜色
–
面:屏幕象素仅包含前向面的颜色

对象表面特征视图

面绘制:光照、透明/光滑性、纹理
面绘制:光照、透明/光滑性、纹理

内部组成或剖面

拆散和剖切显示
拆散和剖切显示

图
立体显示
左、右视图(立体眼镜)
图
三维观察流水线
MC
建
模
坐
标
系
建模
变换
WC
世
界
坐
标
系
三维




观察
变换
VC
观
察
坐
标
系
三维
指定观察参数以及投影类型
投影变换(获得:2D+z)
规范化观察体 View Volume
裁剪
投影,
规范化,
裁剪
PC,NC
投
影
坐
标
系
规
范
化
坐
标
系
视口
变换
DC
设
备
坐
标
系
包含深度信息的二维
三维观察坐标系
在三维世界坐标系中:
指定观察参考点 P
V’
N
指定观察平面法向量 N (z轴)
指定和调整观察向上向量 V (y轴)
V
U
计算出向量 U (x轴)
P
由此,获得uvn观察坐标参考系统
——以V为正上方,站在P点,沿着 -N方向看,
在UV平面上‘看’到的内容
观察平面
三维坐标系的变换
T=

1
0
0
0
0
1
0
0
0 -x0
0 -y0
1 -z0
0 1
复合变换 P’=R·T·P
已知XYZ坐标系下坐标
求X’Y’Z’坐标系下坐标
三维观察变换(世界->观察坐标系)
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为可见性测试使用)
选择二维裁剪窗口:位于观察平面上
指定近-远裁剪平面:获得矩形管道观察体。
观察体的规范化变换。
规范化
平移,缩放
二维裁剪窗口到规范化视
口的复合变换矩阵


平移
缩放
T1 =
S=
ynorm
1
-1
1
xnorm
-1

平移
T2 =
= T2 . S . T1
1 0 -xwmin
0 1 -ywmin
0 0 1
Sx 0 0
0 Sy 0
0 0 1
-1min
1 0 xv
-1min
0 1 yv
0 0 1
2
2
ynorm
y
1
1
Zfar
Znear
z
-1
znorm
这里的变换不负责裁剪!
-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=2  =45
斜等测、斜二测
y
x

z
斜等测投影
45
–
投影平面与某一坐标轴垂直
长度1
45
–
tan=1  =45°  =任意
特点:与投影平面垂直的线投影后长度不变

斜二测投影
–
投影平面与某一坐标轴垂直
–
tan=2  =63.4°  =任意
特点:该轴轴向变形系数为 1/2
长度2
斜二测投影示意图
斜等测投影示意图
斜平行投影的观察体定义及其规范化
对于观察平面平行于xy平面的斜平行投影:





定义斜平行投影向量:获得投影变换矩阵
选择二维裁剪窗口:位于观察平面上
指定近-远裁剪平面:获得斜平行管道观察体
进行投影变换:获得与正投影相同的矩形管道观察体
观察体的规范化变换。(同正投影)
斜平行投影向量
斜平行投影变换矩阵
参考z=Zvp平面的关于z轴的错切
正投影变换矩阵
就是单位矩阵
单位投影向量
(0,0,1)
ort
斜平行投影观察体
y
x
Vp
z
斜平行投影观察体的变换
斜平行投影变换Moblique
所有Z值不变!
仅进行规范化
同正投影
规范化
(同正投影)
任意平行投影的变换过程
(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)
回顾: 平行投影变换
斜平行投影变换Moblique
规范化
透视投影观察体

视觉棱锥体(类似于人眼的视觉圆锥体)

棱台:
–
–
–
裁剪窗口:位于投影平面上
近裁剪平面:去除大对象
远裁剪平面:去除小对象
棱台观察体
约定2:裁剪平面在
投影中心和观察对象
之间。
约定3:近裁剪平面
在投影中心和远裁剪
平面之间。
投影后可能过小
而难以辨别
投影后可能过大
而难以辨别
透视投影观察体的种类

对称透视投影棱台
–

投影中心到裁剪窗口
中心的连线垂直于投
影平面
错切
斜透视投影棱台
对称棱台观察体
定义方法:
投影中心位置+远近裁剪面Z坐标
+裁剪窗口尺寸+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
例:约定前提下的斜对称透视变换
注意:不符合约定前提
时,可能需进行更多的
变换如平移等,相应错
切参数也需重新计算。
透视投影的规范化

注意:不符合约定前提时,可能需进
行更多的变换如平移等,相应参数也
需重新计算。
经过前面的错切和透视变换
– z轴已经垂直于投影平面且穿越窗口中心
x
– 已获得齐次投影坐标
yh
– 已获得矩形管道观察体
= Mpers Mzshear
zh
h
h
x
y
z
1
透视投影的规范化(续)

此时假定左手规范化
坐标系如右图所示:
–
–
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三维观察函数
//下面这个函数指定平行投影观察体
//下面两个函数指定透视投影观察体
//下面函数用于指定观察位置
x(y,z)ref
V’

问题:平行/透视投影用什么方式实现缩放?
–
平行投影:几何变换,视口尺寸改变
透视投影:几何变换,视口尺寸改变,视点位置改变
–
V
x0,y0,z0
观察平面
void lineSegment()
{ GLdouble equ[4]={0.8,3.5,0.0,0.8};
/*剪裁平面的ABCD四个系数*/
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1,0,0);
glLoadIdentity();
glScalef(0.5,1,1);
glClipPlane(GL_CLIP_PLANE0,equ);
glEnable(GL_CLIP_PLANE0);
glutWireTeapot(200);
glFlush(); }
void init()
{
glClearColor(0.0,0.0,0.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-400.0,400.0,-200.0,200.0,400,-400);
glOrtho(-200.0,200.0,-200.0,200.0,400,-400);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 100, 200, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f,
1.0f, 0.0f);
}
void lineSegment()
{ GLdouble equ[4]={0.8,3.5,0.0,0.8};
/*剪裁平面的ABCD四个系数*/
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1,0,0);
glLoadIdentity();
glScalef(0.5,1,1);
glClipPlane(GL_CLIP_PLANE0,equ);
glEnable(GL_CLIP_PLANE0);
glutWireTeapot(200);
glFlush(); }
void init()
{
glClearColor(0.0,0.0,0.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-400.0,400.0,-200.0,200.0,400,-400);
glOrtho(-400.0,400.0,-400.0,400.0,400,-400);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 0, 200, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
}
void init()
{
glClearColor(0.0,0.0,0.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, 1.0f,
gluPerspective(45.0f, 1.0f,
0, 400.0f);
0, 400.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 100, 200, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
}
问题:视点远离会怎样?
gluPerspective(45.0f, 1.0f, 250, 400.0f);
gluPerspective(45.0f, 1.0f, 200, 400.0f);
gluPerspective(45.0f, 1.0f, 0, 400.0f);
(15.0f, 1.0f, 0, 400.0f);
(75.0f, 1.0f, 0, 400.0f);
gluLookAt(0, 100, 200, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
gluLookAt(0, 0, 200, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
gluLookAt(0, 100, 400, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f);
gluPerspective(45.0f, 1.0f, 0, 400.0f);