课程内容进展 综述 建模 观察 显示 其它 ‘图形学’和‘图形系统’ 曲线曲面 实体造型 坐标系统,观察 图元绘制,裁剪 三维观察流水线 曲线曲面 实体造型 坐标系统,观察 图元绘制,裁剪 三维观察流水线 几何变换 图形绘制 可见面判别 光照 面绘制 其它 UI 动画 ……
Three-Dimensional Viewing 第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度全息投影和舞台全息幻影成像、展示幻影成像、空气雾幕成像等 http://wenku.baidu.com/link?url=bzTi1LGDo49KJR60z0cFAGMGQWW3iW_B3op9twDAtmCKLNQ4sT9UIFX4Ya0ZA3-XPG6SpwkkrPC3-uojFFPCH6bVGn8KVy7zTXBrmGZxeRa
相关应用——汽车制造 1比1的仿真感受 动态实时交互,改变配色、轴距、背景以及查看细节特征结构。从多个角度全面观察,并实时进行调整
相关应用——汽车制造 在汽车内部的人机交互部件设计。包括座椅、转向盘、变速杆、指示灯、后视镜、刮水器、车门手柄、多媒体娱乐以及空调等都可以利用虚拟现实技术进行效果模拟
支撑技术——GTX1080 比GeForce GTX 980,TITAN X更强大
支撑技术——GTX1080
End of 第9讲
三维空间的观察过程 与三维观察有关的若干概念 三维观察流水线 三维观察坐标系及其转换
三维观察相关概念 对象指定位置视图投影到显示设备 对象表面特征视图 内部组成或剖面 立体显示 投影(3D to 2D):平行投影、透视投影 深度关系(可见线、面的标识) 线:近亮、远暗/不显示/虚线显示/不同颜色显示 面:屏幕象素仅包含前向面的颜色 对象表面特征视图 面绘制:光照、透明/光滑性、纹理 内部组成或剖面 拆散和剖切显示 立体显示 左、右视图(立体眼镜) 投影(3D to 2D):平行投影、透视投影 图 深度关系(可见线、面的标识) 图 线:近亮、远暗/不显示/虚线显示/不同颜色显示 面:屏幕象素仅包含前向面的颜色 面绘制:光照、透明/光滑性、纹理 图 拆散和剖切显示 图
三维观察流水线 建模 变换 观察 变换 视口 变换 指定观察参数以及投影类型 投影变换(获得:2D+z) 投影, 规范化, 裁剪 MC 建模 变换 WC 观察 变换 VC PC,NC 视口 变换 DC 建模坐标系 世界坐标系 观察坐标系 投影坐标系 规范化坐标系 设备坐标系 三维 三维 指定观察参数以及投影类型 投影变换(获得:2D+z) 规范化观察体 View Volume 裁剪 包含深度信息的二维
三维观察坐标系 在三维世界坐标系中: 由此,获得uvn观察坐标参考系统 指定观察参考点 P 指定观察平面法向量 N (z轴) 指定和调整观察向上向量 V (y轴) 计算出向量 U (x轴) V’ N 观察平面 V U P 由此,获得uvn观察坐标参考系统 ——以V为正上方,站在P点,沿着 -N方向看,在UV平面上‘看’到的内容
三维坐标系的变换 复合变换 P’=R·T·P 1 0 0 -x0 0 1 0 -y0 0 0 1 -z0 T= 0 0 0 1 0 0 0 1 T= 复合变换 P’=R·T·P
三维观察变换(世界->观察坐标系) 1 0 0 -x0 0 1 0 -y0 0 0 1 -z0 0 0 0 1 T= Uux Vuy Nuz 复合变换 P’=R·T·P
三维观察效果 问题:如何在输出设备上获得这些效果? 核心:三维模型向观察平面投影! 固定观察点P,改变N的方向 固定N的方向,改变观察点P位置 问题:如何在输出设备上获得这些效果? 核心:三维模型向观察平面投影! (投影平面)
投影 如何将三维场景显示在二维的设备上 投影的分类 各类投影相应的观察体 实现各类投影的几何变换方法
投影的分类 从三维物体上某点P引出的一条射线(投影线)与观察平面的交点,即为P的投影点。 分类 正投影 正平行投影 正轴测投影 等轴测投影 斜等测 斜二测 斜平行投影 一点透视投影 二点透视投影 三点透视投影 透视投影
投影示意简图 平行投影 透视投影 投影线相互平行 投影线会聚到一点:“投影中心”
正平行投影 (正,正轴测,等轴测) 正投影:观察平面垂直于世界坐标系下某一坐标轴 投影线相互平行 & 投影线与观察平面垂直 平行性不变 投影线相互平行 & 投影线与观察平面垂直 正投影:观察平面垂直于世界坐标系下某一坐标轴 平行性不变 尺寸比例不变 三维结构 三视图 正投影 重建
正轴测投影 正轴测: 观察平面不垂直于任一坐标轴 线的平行性不变 包括正等测(等轴测)、正二测、正三测 (注意:投影线仍与投影平面垂直) 等轴测: 观察平面和三根坐标轴交点离原点的距离相等(|a|=|b|=|c| 八种)
正轴测投影示意图 为紫色平面建立一个原点和世界坐标系原点重合的观察坐标系 世界
正投影的观察体定义及其规范化 对于观察平面平行于xy平面的正投影: xp=x,yp=y,zp=z(所有投影变换均需保留z为可见性测试使用) 选择二维裁剪窗口:位于观察平面上 指定近-远裁剪平面:获得矩形管道观察体。 观察体的规范化变换。 规范化 平移,缩放
二维裁剪窗口到规范化视口的复合变换矩阵 = T2 . S . T1 1 0 -xwmin 0 1 -ywmin 0 0 1 平移 缩放 0 0 1 平移 缩放 T1 = 2 Sx 0 0 0 Sy 0 0 0 1 S = 2 ynorm 1 1 0 xvmin 0 1 yvmin 0 0 1 -1 -1 1 T2 = xnorm -1
ynorm y 1 = T2 . S . T1 1 -1 znorm z Zfar Znear -1 这里的变换不负责裁剪!
斜平行投影 投影线相互平行 & 投影线与观察平面不垂直
0-90 = 0-360 ( ) 时为正投影
斜等测、斜二测 斜等测投影 斜二测投影 投影平面与某一坐标轴垂直 tan=1 =45° =任意 特点:与投影平面垂直的线投影后长度不变 斜二测投影 tan=2 =63.4° =任意 特点:该轴轴向变形系数为 1/2
斜二测投影示意图
斜等测投影示意图
斜平行投影的观察体定义及其规范化 对于观察平面平行于xy平面的斜平行投影: 定义斜平行投影向量:获得投影变换矩阵 选择二维裁剪窗口:位于观察平面上 指定近-远裁剪平面:获得斜平行管道观察体 进行投影变换:获得与正投影相同的矩形管道观察体 观察体的规范化变换。(同正投影)
斜平行投影向量
斜平行投影变换矩阵 参考z=Zvp平面的关于z轴的错切 ort 正投影变换矩阵就是单位矩阵 单位投影向量(0,0,1)
斜平行投影观察体
斜平行投影观察体的变换 斜平行投影变换Moblique 所有Z值不变! 仅进行规范化 同正投影 规范化 (同正投影)
任意平行投影的变换过程 (1)坐标系变换:世界坐标系经变换,与观察坐标系(右手或左手系)重合 此时:投影平面变为Z=0(XY平面) (2)错切: Moblique 使斜平行投影变成正投影 (3)规范化(平移,缩放): Mortho norm
透视投影 透视投影的特点: 投影中心无限远离投影平面时,即等同于平行投影 “近大远小”:线段投影缩小程度与投影平面位置的关系 投影参考点(投影中心) 透视投影的特点: “近大远小”:线段投影缩小程度与投影平面位置的关系 不平行于投影平面的平行线段组,投影后仍平行。 不平行于投影平面的平行线段组,投影后会聚。 投影中心无限远离投影平面时,即等同于平行投影
透视投影分类(灭点Vanishing point) 每组平行线条的会聚点称为一个“灭点” 主灭点:这组平行线条平行于某个坐标轴 一点透视 :投影平面只与一个坐标轴相交 二点透视 :投影平面只与二个坐标轴相交 三点透视 :投影平面只与三个坐标轴相交
透视投影的观察体定义及其规范化 对于观察平面平行于xy平面的透视投影: 定义投影中心 定义观察体 进行投影变换:获得矩形管道观察体 选择观察体类型并获得相应的投影变换矩阵 选择二维裁剪窗口:位于观察平面上 指定近-远裁剪平面 进行投影变换:获得矩形管道观察体 观察体的规范化变换。
+ 约定1:投影平面平行于xy平面(只与z轴相交),且其法向量平行于Z轴正向。 经过透视投影后任意点P的z坐标都变换成Zvp了吗?
透视投影变换 【注意:】 ZprpZ(投影平面上的对象点无需投影) 每个对象点的h值均不同,是z的线性函数 【问题:】 Zp是什么?
透视投影变换矩阵 Zh=sz·z + tz Zp =Zh / h 因此,Zp Zvp是对Z进行规范化和齐次变换,保留了深度信息。 xh yh zh h x y z 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/视场角 作用 是规范化和裁剪的依据
对称透视观察体的变换示意图 透视变换
例:约定前提下的斜棱台观察体 约定:投影中心为原点,投影平面就是近裁剪平面 经过错切后,xy坐标变化,z不变
斜棱台错切成对称棱台示意图
例:约定前提下的斜对称透视变换 注意:不符合约定前提时,可能需进行更多的变换如平移等,相应错切参数也需重新计算。
透视投影的规范化 经过前面的错切和透视变换 z轴已经垂直于投影平面且穿越窗口中心 已获得齐次投影坐标 已获得矩形管道观察体 注意:不符合约定前提时,可能需进行更多的变换如平移等,相应参数也需重新计算。 透视投影的规范化 经过前面的错切和透视变换 z轴已经垂直于投影平面且穿越窗口中心 已获得齐次投影坐标 已获得矩形管道观察体 xh yh zh h x y z 1 = Mpers Mzshear
透视投影的规范化(续) 此时假定左手规范化坐标系如右图所示: 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); glOrtho(-400.0,400.0,-200.0,200.0,400,-400); glMatrixMode(GL_MODELVIEW); gluLookAt(0, 100, 200, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); } { 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); glOrtho(-200.0,200.0,-200.0,200.0,400,-400); gluLookAt(0, 100, 200, 0.0f, 0.0f, 0.0f, 0.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); glOrtho(-400.0,400.0,-200.0,200.0,400,-400); glMatrixMode(GL_MODELVIEW); gluLookAt(0, 0, 200, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); } { GLdouble equ[4]={0.8,3.5,0.0,0.8}; /*剪裁平面的ABCD四个系数*/ glClipPlane(GL_CLIP_PLANE0,equ); glEnable(GL_CLIP_PLANE0); glLoadIdentity(); glScalef(0.5,1,1); glOrtho(-400.0,400.0,-400.0,400.0,400,-400);
gluPerspective(45.0f, 1.0f, 0, 400.0f); void init() { glClearColor(0.0,0.0,0.0,0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, 1.0f, 0, 400.0f); glMatrixMode(GL_MODELVIEW); 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); 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);