相机、透视图、视口、投影

    渲染好的场景都需要一个可以供用户查看的视图,我们通常在3D场景中用相机来提供这种需求。相机相对场景有位置和方向,就像我们生活中的相机一样,它也提供透视图查看方式,这种方式可以有近大远小的效果。相机最终会将三维的场景渲染成一幅幅二维的图片,我们就可以通过它的视口进行观察。

    相机处理计算时主要涉及到两个矩阵,第一个是线性变换矩阵(之前章节我们称为转换矩阵),它负责定义场景物体的位置和朝向,第二个是投影矩阵,它负责将三维场景物体投影到二维视口中。当然具体的细节需要太多数学理论,所以Unity3D都将这些已经封装好了,我们开发人员只需要简单的“瞄准、发射”。

    图3-5中描述的是相机核心概念视口和投影,在图中左下角那只大眼睛就代表我们的相机所处的位置,红色的x轴代表相机的朝向,两个蓝色的方块就是被观察的物体,绿色和红色的矩形分别代表近切面和远切面(两个切面之间的物体才可以被看见,而这之间的区域我们称为可视平截椎),近切面就是我们的视口,投影在视口上的图像就是我们真正看见的图像。
 
图3-5

    相机非常强大,它可以让观察者非常真实地观察一个三维场景,此外,它还为动画场景提供了强大的支持,通过移动相机就可以像拍电影一样创建一个动态的叙事的场景,当然,对于VR来说需要我们不能随意移动相机,如果要移动相机我们需要多方面考量,最好做到让用户完全控制相机,这样用户会有一种身临其境的感觉。

立体渲染

    在虚拟现实中,三维图像渲染是一个大问题,然而现在又碰到了如何处理相机这个难题,相机本身就需要处理变换矩阵和投影矩阵,可恶的是,VR中我们还需要处理两次(每只眼睛处理一次)。不过境况并没有那么糟糕,我们有几种处理相机的方法,下面来介绍一个最简单的方法:

    创建一个主相机:应用程序控制唯一一个主相机,所有的逻辑动画等等都只针对主相机,这样,我们在处理相机与其他物体交互的时候就变得简单统一,此外需要注意主相机不参与真正的渲染。主相机还有一个好处,就是可以在双立体视图和传统单一视图之间切换。

    用两个相机渲染:除了主相机,VR程序需要外加两个相机,用来真正处理渲染。这两个相机需要与主相机的位置和朝向保持一致,只是有一点不同,就是它们分别要向左向右偏移一点点,用来模拟我们的瞳距。

    渲染至两个视口:VR应用分别创建的左右眼的渲染相机,它们的视口宽度都是屏幕宽度的一半,高度都为屏幕高度。每个相机处理图形的时候都用了特殊的投影矩阵,这个投影矩阵可以处理反畸变问题(Oculus SDK中提供了这个算法)。

    至此,我们已经简单的了解了VR的图像处理过程,这里讲的非常简单,如果要深入那么每一个点都可以用一整本书来介绍。随着你的程序变得越来越庞大,你需要处理大量的底层问题,对于这些问题最好交个游戏引擎来做,当然,你要是非常NB,你可以自己写一个引擎,但是如果你跟我一样希望集中精力做应用层的事情,那么最好还是使用一个现成的引擎。目前市面上有许多很好的引擎,其中包括下节要介绍的Unity3D游戏引擎。

《VR入门系列教程》之13---相机与立体渲染的更多相关文章

  1. 《VR入门系列教程》之18---Oculus代码剖析

    代码剖析 原文作者:Tony Parisi     那么,Unity究竟是如何支持Oculus VR运行的?首先,我们来看看Unity场景是如何构建的.在Unity集成开发包中有一个相机预设体,这个预 ...

  2. 《VR入门系列教程》之10---3D图形学初识

    第三章 基于Oculus Rift开发桌面端VR应用     接下来的几个章节中我们会进行VR开发的实际操练,本章就从Oculus Rift开发开始,我们会介绍如何开发一个桌面端的VR应用.虽然只是介 ...

  3. 《VR入门系列教程》之3---运动追踪与输入设备

    运动追踪设备    第二种可以使人脑相信它真实处于虚拟世界的关键技术就是运动追踪技术,它可以通过追踪头部的运动状态实时更新渲染的场景.这与我们在真实世界中观看周围非常类似.    高速的惯性测量单元( ...

  4. 《VR入门系列教程》之22---GearVR SDK代码剖析

    GearVR SDK代码剖析     接下来我们来了解一下GearVR开发包的底层代码,它底层的代码和之前在第三章中讲的桌面SDK代码非常类似,当然,也有许多不同的地方.     首先,我们看看如何构 ...

  5. 《VR入门系列教程》之9---谷歌纸盒

    谷歌纸盒---基于智能手机的廉价VR眼镜     如果用汽车来做类比,Oculus Rift和GearVR就是特斯拉和兰博基尼,它们物美但是价不廉.要是主机性能不好,那么几百美元的Oculus眼镜就是 ...

  6. 《VR入门系列教程》之14---面向大众的Unity3D

    大众化的游戏引擎--Unity3D     并不是所有VR应用都是游戏,然而现在做VR开发的几乎都会用专业游戏引擎来做,因为游戏引擎既满足了一个引擎的要求又可以方便地制作出高品质的VR应用.一个游戏引 ...

  7. 《VR入门系列教程》之2---VR头显

    什么是虚拟现实?     虚拟现实的目标:让人们相信真实地处于一个虚拟世界中.要达到这个目标就得让人们的大脑(负责视觉和运动感知部分)欺骗他们.不同技术合在一起才可以创造这种幻觉,包括:     全立 ...

  8. 《VR入门系列教程》之1---预热篇

     序     初识虚拟现实技术,非常倾心,奋力习之,阅<Learning Virtual Reality>一书之后觉得甚好,但不愿独乐乐,于是翻译之,与大家共同学习.本人学艺不精,难免有翻 ...

  9. 《VR入门系列教程》之20---使用Oculus移动端SDK

    使用Oculus移动端SDK     在基于安卓系统的GearVR上开发应用需要用到Oculus的移动端SDK,下面的网址可以下载SDK:http://developer.oculus.com     ...

随机推荐

  1. java多线程之管道流

    java语言中提供了各种各样的流供我们操纵数据,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据. 一个线程发送数据到输出管道,另一个线程从输入管道读取数据,通过使用管道 ...

  2. HTML连载10-details标签&summary标签&marquee标签

    ​1.详情(details)与概要(summary)标签 (1)作用:我们希望用尽可能少的空间来表达更多的信息,利用summary标签来描述概要信息,用details标签来描述详情信息 (2)格式: ...

  3. 3013C语言_输入输出

    第三章 输入输出 3.1输入输出概念及其实现 (1)数据从计算机内部向外部输出设备(如显示器.打印机等)输送的操作称为 “输出”,数据从计算机外部向输入设备(如键盘.鼠标.扫描仪等)送入的操作称为 “ ...

  4. 如何开发优质的 Flutter App:应用架构的搭建

    各位读者朋友们,好久不见了! 最近博主一直在忙于工作以及写<Flutter入门与应用实战>的书,所以没有时间打理博客.今天来给大家分享一个博主在GitChat上发起的一场Chat. 下面是 ...

  5. java中list和Arrylist的区别

    List:是一个有序的集合,可以包含重复的元素.提供了按索引访问的方式.它继承 Collection. List有两个重要的实现类:ArrayList 和 LinkedList ArrayList:我 ...

  6. 5个现在就该使用的数组Array方法: indexOf/filter/forEach/map/reduce详解(转)

    ECMAScript5标准发布于2009年12月3日,它带来了一些新的,改善现有的Array数组操作的方法.然而,这些新奇的数组方法并没有真正流行起来的,因为当时市场上缺乏支持ES5的浏览器.     ...

  7. Spark学习之路(八)—— Spark SQL 之 DataFrame和Dataset

    一.Spark SQL简介 Spark SQL是Spark中的一个子模块,主要用于操作结构化数据.它具有以下特点: 能够将SQL查询与Spark程序无缝混合,允许您使用SQL或DataFrame AP ...

  8. HBase 学习之路(十)—— HBase的SQL中间层 Phoenix

    一.Phoenix简介 Phoenix是HBase的开源SQL中间层,它允许你使用标准JDBC的方式来操作HBase上的数据.在Phoenix之前,如果你要访问HBase,只能调用它的Java API ...

  9. 黑马程序员_ADO.Net(ExecuteReader,Sql注入与参数添加,DataSet,总结DataSet与SqlDataReader )

    转自https://blog.csdn.net/u010796875/article/details/17386131 一.执行有多行结果集的用ExecuteReader SqlDateReader  ...

  10. 走进python

    python史 1.python之父 Guido van Rossum 2.python的优缺点 优点:开发效率高,可跨平台,可嵌入,可扩展,优雅简洁 缺点:运行稍慢,代码不能加密,不能实现真正的多线 ...