分享

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

 ny叶子 2017-02-20

导读: 3D图像在VR场景扮演了及其重要的角色。因此开发者如何开发3D图像,并实现用户与场景的互动就显得非常重要。虽然本文是以Oculus Rift为例展开的介绍,但同样适用于HTC Vive等头盔设备。

在进行第一个VR应用开发之前,我们来看看几个重要的概念:

搭建场景:创建一个可视化、可交互、脚本驱动的虚拟现实环境。

立体渲染:用两个相机渲染场景分别表示用户的左右眼,然后通过Oculus Rift头显的透镜,这两幅图片被重合在一起,从而形成清晰且具有深度视觉的场景。

头动追踪:通过捕获Oculus Rift头显的位置和转向来改变虚拟世界中相机的位置和转向。

我们需要编写大量3D操作的代码来表现我们的想法,可以直接通过OpenGL和DirectX来渲染3D视图,但是这样做太浪费时间了,而且也超出了本书的范畴。我们unity3D游戏引擎来做这件事,Unity用于快速构建VR内容非常合适,最主要的是它非常容易掌握。

在深入研究Unity之前,我们来简单了解一下基本的3D图形技术。如果你对3D图形编程已经非常熟悉了,这部分内容可以直接跳过。

3D图形学基础定义

在继续之前,我们来看看3D图形学的定义,下面是维基百科给出的定义:3D computer graphics (in contrast to 2D computer graphics) are graphics that use a three-dimensional representation of geometric data (often Cartesian) that is stored in the computer for the purposes of performing calculations and rendering 2D images. Such images may be stored for viewing later or displayed in real-time.

上面的定义主要有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-1

unity3d采用的坐标系就是上图所示这种,只不过它的z轴方向是外向里。我们图中显示的是右手坐标系,而且Unity3D中的是左手坐标系,需要注意的是OpengGL通常也是采用的右手坐标系。

二、网格、多边形、顶点

绘制3D图形有许多方法,用的最多的是用网格绘制。一个网格由一个或多个多边形组成,这些多边形的顶点都是三维空间中的点,它们具有x、y、z三个坐标值。网格中通常采用三角形和四边形,这些基本面片可以围成网格,从而形成了模型。

图3-2中就是一个三维网格,黑色的线条就是四边形的边,这些四边形围出了一个人脸的形状。当然,这些黑色的线条在最终渲染的图形中是不可见的。网格的节点坐标仅仅表示了模型的外形,网格表面的颜色、光照用另外的属性表示,这些我们在后面会介绍。

图3-2

三、材质、贴图、光照

除了x、y、z坐标以外,网格的表面采用另外的属性表示。表面属性可以非常简单地采用单色,也可以采用复杂的方法,比如它的反光效果怎么样或者它看起来是否有光泽。网格表面还可以采用一个或多个位图,一个我们叫贴图,多个我们叫图集。贴图可以是文字效果(例如T恤上面的图案),也可以是复杂的粗糙效果或彩虹效果。大多数的图形系统会将网格的表面属性统一用材质来表示,而材质最终表现出来的效果会受环境中的光照影响。

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

四、转换矩阵

模型网格的三维空间位置都是由它们的顶点坐标决定的,如果每次想要移动一下模型位置都要依次改变每个网格的顶点坐标,这将一件非常头疼的事,要是遇上需要显示动画效果那就更糟了。为了解决这个问题,大部分的三维系统都会提供转换操作,这个操作原理是整体移动网格,这样网格与世界坐标就有一个相对转换,而不需要去改变每一个顶点的坐标值。其中,转换操作包括:移动、旋转、缩放,这些操作都是针对网格整体相对世界坐标系的,而不是特定的每一个顶点。

1  2  下一页>

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多