VR开发入门:3D图像的处理过程

结晶氯化铝
VR开发⼊门:3D图像的处理过程
在进⾏第⼀个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中的模型使⽤的材质颜⾊是深紫⾊,表⾯光照效果表现的是受到了左侧的光照,这点我们可以通过右侧的阴暗部分看出来。
转换矩阵模型⽹格的三维空间位置都是由它们的顶点坐标决定的,如果每次想要移动⼀下模型位置都要依次改变每个⽹格的顶点坐标,这将⼀件⾮常头疼的事,要是遇上需要显⽰动画效果那就更糟了。为了解决这个问题,⼤部分的三维系统都会提供转换操作,这个操作原理是整体移动⽹格,这样⽹格与世界坐标就有⼀个相对转换,⽽不需要去改变每⼀个顶点的坐标值。其中,转换操作包括:移动、旋转、缩放,这些操作都是针对⽹格整体相对世界坐标系的,⽽不是特定的每⼀个顶点。图3-3中展⽰了转换操作,图中有三个⽴⽅体,每⼀个⽴⽅体都是由⼀个⽴⽅体⽹格组成,它们都包含相同的顶点,在我们进⾏移动、旋转、缩放操作的时候不需要改变这些顶点的坐标值,⽽是给⽴⽅体⽹格赋予⼀个转换操作。左边红⾊的⽴⽅体向右移动了4个单位(进⾏了[-4,0,0]操作),然后⼜相对x和y轴进⾏了旋转(这⾥注意⼀下,我们这⾥⾓度的单位是弧度,即⼀弧度等于360度除以2*PI)。右边蓝⾊的⽴⽅体向右移动了4个单位,然后对三个⽅向都放⼤了1.5倍,中间绿⾊⽴⽅体就是最初始位置。
图3-3
我们⽤⼀个矩阵来代表转换操作,这个矩阵中保存着⼀个数组,通过这个数组进⾏⼀些数学计算就可以得到转换以后的顶点坐标值。⼤部分的转换矩阵⽤4*4的数组表⽰,这个数组包含4⾏4列⼀共16个数。图3-4就是⼀个4*4数组的⽰意图,其中m12、m13、m14⽤来操作移动,m0、m5、m10⽤来操作缩放,m1和m2、m4和m6、m8和m9分别⽤来操作相对x、y、z轴的旋转,转换矩阵乘以顶点坐标就是转换之后的坐标。
图3-4
最小二乘估计如果你同我⼀样是个线性代数极客,我这么讲你肯定听得懂,如果你不熟悉线性代数也没关系,unity3D以及其它⼯具中已经将这些操作都封装好了,我们只需要正确调⽤它们的API即可,但是了解⼀下这些操作的底层计算过程总还是好的。
相机、透视图、视⼝、投影渲染好的场景都需要⼀个可以供⽤户查看的视图,我们通常在3D场景中⽤相机来提供这种需求。相机相对场景有位置和⽅向,就像我们⽣活中的相机⼀样,它也提供透视图查看⽅式,这种⽅式可以有近⼤远⼩的效果。相机最终会将三维的场景渲染成⼀幅幅⼆维的图⽚,我们就可以通过它的视⼝进⾏观察。相机处理计算时主要涉及到两个矩阵,第⼀个是线性变换矩阵(之前章节我们称为转换矩阵),它负责定义场景物体的位置和朝向,第⼆个是投影矩阵,它负责将三维场景物体投影到⼆维视⼝中。当然具体的细节需要太多数学理论,所以unity3D都将这些已经封装好了,我们开发⼈员只需要简单的“瞄准、发射”。图3-5中描述的是相机核⼼概念视⼝和投影,在图中左下⾓那只⼤眼睛就代表我们的相机所处的位置,红⾊的x轴代表相机的朝向,两个蓝⾊的⽅块就是被观察的物体,绿⾊和红⾊的矩形分别代表近切⾯和远切⾯(两个切⾯之间的物体才可以被看见,⽽这之间的区域我们称为可视平截椎),近切⾯就是我们的视⼝,投影在视⼝上的图像就是我们真正看见的图像。
图3-5
周洋感谢门
相机⾮常强⼤,它可以让观察者⾮常真实地观察⼀个三维场景,此外,它还为动画场景提供了强⼤的⽀持,通过移动相机就可以像拍电影⼀样创建⼀个动态的叙事的场景,当然,对于VR来说需要我们不能随意移动相机,如果要移动相机我们需要多⽅⾯考量,最好做到让⽤户完全控制相机,这样⽤户会有⼀种⾝临其境的感觉。
马弗罐
⽴体渲染在虚拟现实中,三维图像渲染是⼀个⼤问题,然⽽现在⼜碰到了如何处理相机这个难题,相机本⾝
就需要处理变换矩阵和投影矩阵,可恶的是,VR中我们还需要处理两次(每只眼睛处理⼀次)。不过境况并没有那么糟糕,我们有⼏种处理相机的⽅法,下⾯来介绍⼀个最简单的⽅法:
创建⼀个主相机:应⽤程序控制唯⼀⼀个主相机,所有的逻辑动画等等都只针对主相机,这样,我们在处理相机与其他物体交互的时候就变得简单统⼀,此外需要注意主相机不参与真正的渲染。主相机还有⼀个好处,就是可以在双⽴体视图和传统单⼀视图之间切换。
南社
⽤两个相机渲染:除了主相机,VR程序需要外加两个相机,⽤来真正处理渲染。这两个相机需要与主相机的位置和朝向保持⼀致,只是有⼀点不同,就是它们分别要向左向右偏移⼀点点,⽤来模拟我们的瞳距。
渲染⾄两个视⼝:VR应⽤分别创建的左右眼的渲染相机,它们的视⼝宽度都是屏幕宽度的⼀半,
⾼度都为屏幕⾼度。每个相机处理图形的时候都⽤了特殊的投影矩阵,这个投影矩阵可以处理反畸变问题(Oculus SDK中提供了这个算法)。
⾄此,我们已经简单的了解了VR的图像处理过程,这⾥讲的⾮常简单,如果要深⼊那么每⼀个点都可以⽤⼀整本书来介绍。随着你的程序变得越来越庞⼤,你需要处理⼤量的底层问题,对于这些问题最好交个游戏引擎来做,当然,你要是⾮常NB,你可以⾃⼰写⼀个引擎,但是如果你跟我⼀样希望集中精⼒做应⽤层的事情,那么最好还是使⽤⼀个现成的引擎。⽬前市⾯上有许多很好的引擎,其中包括下节要介绍的unity3d游戏引擎。

本文发布于:2024-09-23 22:31:00,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/71515.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:操作   需要   转换   矩阵   场景   渲染   处理
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议