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
Uux
Vuy
Nuz
复合变换 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了吗?
透视投影变换
【注意:】
ZprpZ(投影平面上的
对象点无需投影)
每个对象点的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);