虚拟现实开发入门:3D图像的处理过程

www.fun88.com

2018-10-06

在进行第一个应用开发之前,我们来看看几个重要的概念:搭建场景:创建一个可视化、可交互、脚本驱动的环境。 立体渲染:用两个相机渲染场景分别表示用户的左右眼,然后通过OculusRift头显的透镜,这两幅图片被重合在一起,从而形成清晰且具有深度视觉的场景。 头动追踪:通过捕获OculusRift头显的位置和转向来改变虚拟世界中相机的位置和转向。 我们需要编写大量3D操作的代码来表现我们的想法,可以直接通过OpenGL和DirectX来渲染3D视图,但是这样做太浪费时间了,而且也超出了本书的范畴。

我们unity3D游戏引擎来做这件事,Unity用于快速构建VR内容非常合适,最主要的是它非常容易掌握。 在深入研究Unity之前,我们来简单了解一下基本的3D图形技术。

如果你对3D图形编程已经非常熟悉了,这部分内容可以直接跳过。 3D图形学基础定义在继续之前,我们来看看3D图形学的定义,下面是维基百科给出的定义:3Dcomputergraphics(incontrastto2Dcomputergraphics)aregraphicsthatuseathree-dimensionalrepresentationofgeometricdata(oftenCartesian)thatisstoredinthecom上面的定义主要有3个部分:(1)所有的数据都以三维坐标系方式表示。 (2)它们最终都会画(渲染)在一张二维图上,其中VR会分成左右眼画在两张图上。

(3)图像都是实时渲染的,当一些动画或者用户操作引起了3D数据的改变,它们所渲染出来的图像会实时更新,这种更新频率必须让人眼无法察觉。 以上三点中最后一点是建立可交互应用的关键。 事实上,3D图形渲染技术如此重要,以至于它已经创造了几十亿美元的市场,许多大公司都在一心专注做3D实时渲染的技术,比如NVIDIA、ATI、Qualcomm等。

一、三维坐标系统如果你熟悉二维坐标系,如Windows桌面应用或者IOS手机应用采用的坐标系,你一定知道x、y轴。

二维坐标可以表示子窗体或者UI控件摆放的位置,当调用绘图API是可以定义画笔和画刷的绘制点。 与二维坐标类似,三维坐标系统只是多了一个z轴,这个方向用来描述深度信息(一个物体距离屏幕的远近),如果你已经了解二维坐标系的概念,那么转换到三维坐标系就很简单了。

图3-1是本书采用的坐标系示意图,它的x轴水平,方向为左到右,y轴竖直,方向为下到上,z轴穿过屏幕,方向为里到外,并且,这三个轴都相互垂直。 有些三维坐标系的z轴是竖直的,而y轴是穿过屏幕。 图3-1unity3d采用的坐标系就是上图所示这种,只不过它的z轴方向是外向里。 我们图中显示的是右手坐标系,而且Unity3D中的是左手坐标系,需要注意的是OpengGL通常也是采用的右手坐标系。

二、网格、多边形、顶点绘制3D图形有许多方法,用的最多的是用网格绘制。

一个网格由一个或多个多边形组成,这些多边形的顶点都是三维空间中的点,它们具有x、y、z三个坐标值。

网格中通常采用三角形和四边形,这些基本面片可以围成网格,从而形成了模型。

图3-2中就是一个三维网格,黑色的线条就是四边形的边,这些四边形围出了一个人脸的形状。 当然,这些黑色的线条在最终渲染的图形中是不可见的。

网格的节点坐标仅仅表示了模型的外形,网格表面的颜色、光照用另外的属性表示,这些我们在后面会介绍。 图3-2三、材质、贴图、光照除了x、y、z坐标以外,网格的表面采用另外的属性表示。 表面属性可以非常简单地采用单色,也可以采用复杂的方法,比如它的反光效果怎么样或者它看起来是否有光泽。

网格表面还可以采用一个或多个位图,一个我们叫贴图,多个我们叫图集。 贴图可以是文字效果(例如T恤上面的图案),也可以是复杂的粗糙效果或彩虹效果。

大多数的图形系统会将网格的表面属性统一用材质来表示,而材质最终表现出来的效果会受环境中的光照影响。

图3-2中的模型使用的材质颜色是深紫色,表面光照效果表现的是受到了左侧的光照,这点我们可以通过右侧的阴暗部分看出来。

四、转换矩阵模型网格的三维空间位置都是由它们的顶点坐标决定的,如果每次想要移动一下模型位置都要依次改变每个网格的顶点坐标,这将一件非常头疼的事,要是遇上需要显示动画效果那就更糟了。

为了解决这个问题,大部分的三维系统都会提供转换操作,这个操作原理是整体移动网格,这样网格与世界坐标就有一个相对转换,而不需要去改变每一个顶点的坐标值。 其中,转换操作包括:移动、旋转、缩放,这些操作都是针对网格整体相对世界坐标系的,而不是特定的每一个顶点。