projection and view matrices

OSVR视图变换

该文章英文地址,翻译中有一些个人添加的辅助信息,以括号标识,以粗体表示,例如(以下为个人翻译,水平有限,欢迎指正).
本文档介绍OSVR的视图变换,包含投影矩阵和设置视口所需的模型矩阵的部分内容.可以查看distortion document获得关于如何处理畸变矫正的文档(透镜是非理想状态的,屏幕表面不是完全平整的).
接下来的内容忽略眼球追踪的影响,以及忽略眼睛的投影中心与它的旋转中心不完全重合的的情况.对于任一特定的视图方向,投影中心是沿着旋转中心的前方的,所以这2个中心是非常接近重合的.如果考虑眼球追踪的话,唯一的区别是需要把眼睛的位置从眼睛的旋转中心移动到入瞳的中心.

简介

结合投影和视图矩阵的目的是为了提供一个几何描述,来说明如何正确的将所有3D的点投影到一个矩形屏幕上,使观看者在移动和旋转时感觉他们在这个3D空间中一样.
这需要确定每个眼睛的位置和屏幕在相同的坐标系里.如The Visual Display Transformation for Virtual Reality所描述的模型里,他们称这坐标系为Room Space ,这个空间与使用者所处的位置物理房间或其他空间有很强的关联性.
当我们在处理固定屏幕显示时,例如:有立体感的头部追踪显示器,CAVE显示,VR desk设计,这些场景中,眼睛可以随处转动,但屏幕始终保持在房间空间里的固定位置.当我们设计头戴显示时,屏幕跟随眼睛一起移动,与眼睛保持相同的相对位置,虽然这会影响我们如何确定这些位置,但是它不会影响基础数学的使用.
为了使讨论更容易描述和理解,我们会先介绍二维的情况.(三维情况有两个屏幕方向的正交解决方案,但增加了两个方向).

不通过透镜的情况

下图是眼睛直接观看屏幕,不通过透镜的情况,如下图所示,这是固定屏幕的情况,但对头戴式的情况是类似的.我们稍后会在眼睛和屏幕之间添加上透镜.讨论时以物理世界的单位,而不是使用像素或视图的单位.
这里写图片描述
眼睛和屏幕两端的位置是是用来确定投影和视图矩阵所需的信息.接下来描述如何确定它们(投影和视图矩阵)当它们的信息(眼睛和屏幕两端的位置)被获取到,视图和投影矩阵就可以被构建出来.(在某一个时间,模型,视图,投影矩阵在分开的单独的函数里被定义和执行.目前实现提供他们的全部矩阵,所以计算哪一部分,这个是由实现的人来决定的.最初的讨论描述了使用的操作,而不是他们如何被使用).
投影:投影的结果是将2D图像显示在一个平的投影表面上.为了正确显示在屏幕上,投影表面需要平行于物理屏幕,并且与视网膜上的相同区域对应.它可以移动到眼睛更近或更远的距离,但是必须进行缩放,使它的边缘与真实屏幕处于同一投影位置.这是最容易考虑到的角度和视角方向,它们与深度无关.
最理想的情况是沿着眼睛注视的方向投影到屏幕的中心.但是这样做会使投影到的平面与屏幕不平行.为了使两者平行,投影方向必须垂直于屏幕,沿着法线投影.注意,这可能导致当注视方向偏离中心(离轴投影)时,投影中心位于屏幕之外,因为这种特别的投影方向,有两个角度需要被指定,一个是屏幕的每一个边缘,一个旋转投影方向指向屏幕的左边缘(上图中轻微的正旋转),另一个指向屏幕的右边缘(上图中的一个大的负旋转)。
视图:视图矩阵的任务就是将投影中心转化到世界空间中.这就需要将最初眼睛空间转化为它在世界空间中的位置,并旋转它,使眼睛空间里-Z轴方向是沿着世界空间投影的方向.连同投影,这将使三维点映射到世界坐标中,并且将他们投影到虚拟的屏幕上,这种投影与观察者眼睛的中心相匹配.

三维的情况

从上面二维到一维的例子来看三维到二维的情况,三维到二维的投影需要一个转换来设置相对于屏幕的眼睛的垂直位置.它需要再旋转两次,使眼睛空间的X轴平行于屏幕空间的X轴(从左到右),使眼睛空间的Y轴平行与屏幕空间的Y轴(从下到上).结合Z轴的旋转,虚拟屏幕的四个边缘与物理屏幕的边缘对齐.
实施:这些转换最终必须在图形库中实现,然后应用到显示世界中.OpenGL,Direct 3D,Unreal这些库每个都有自己的坐标系统.其中一些是右手定则,有些是左手定则,起点(0,0点)有的是在屏幕的左上角,有些是在左下角.有一些指定了世界空间的单位(米,厘米),有一些则没有.本文档中描述的坐标系统是OSVR内部系统.OSVR包含一些适配的接口(一些在core中,一些在RenderKit中),来转换视图,模型,投影等库.

寻找眼睛空间

在OSVR中,头部空间定义在两眼旋转中心的中间,X轴指向右眼,Y轴指向上方,Z轴指向头部的背面.将房间空间转换到头部空间是追踪和内部系统的任务,这个在其他地方进行讨论.从头部空间转换到眼睛空间,右眼是在X轴正方向+IPD的一半,左眼是在X轴的负方向-IPD的一半.(比如IPD是0.63,那么左眼就是-0.315,右眼是+0.315)

寻找屏幕边缘

对于固定屏幕的显示器,屏幕的位置必须被测量出来,以便在房间空间中确定出边缘的位置.对于头戴显示器,例如OSVR HDK,屏幕位置在眼睛空间中是固定的.这就意味着当观察者在环境中移动,矩阵的投影部分始终保持固定.
因为HMD中的屏幕与观众眼睛很近,很容易被看清.HMD通过透镜将物理屏幕映射到一个虚拟的屏幕上.在下一节中描述这一影响.

理想透镜

一个理想的透镜能够放大或缩小所有物体(这些物体是指通过透镜看到的物体).下图显示的是屏幕放大后的效果,并且看起来物体被移动看到更远的地方,生成的这个屏幕的图像平行于实际的屏幕,并且位于它的后方.注意,通过镜头的光线被弯曲了,使得图像看起来比直接投影时的更大,视野更宽(增大了FOV).
这里写图片描述
确定投影和视图变换的算法与上面是一样的,除了对于测量都应该是在屏幕的图像上,而不是物理屏幕上.从理论上来说这并不难,但是实际上具有挑战性的问题是如果不知道透镜的特性情况下,测量这些参数,是非常困难的,因为屏幕的边缘无法通过镜头看到.假设你知道了透镜的特性和屏幕相对于镜头的物理尺寸和位置,就可以计算图像的位置.如果没有,就要进行一些必须的校准(见下文).

可调节透镜

一些头戴显示器,例如OSVR HDK,允许用户调节镜片的位置使能够有足够空间容纳眼镜,调节与显示屏的宽度,使使用者将出瞳位置调节到最适合的状态.
用在OSVR HDK的早期版本上的一个光学系统的例子:当透镜相对于真实屏幕移动时,眼睛透过镜片看到的图像的位置和大小都会有相应的变化.当透镜靠近屏幕时(与眼睛远的方向),屏幕的图像看起来会更大,产生更大的FOV.当透镜向左移动时,屏幕的图像是向右移动的.当透镜保持在左边,眼睛在出瞳距离范围内移动,图像保持不变.(当眼睛移动在出瞳距离范围之外,畸变将会被看到,详细见distortion document).

理想透镜方案

只要观察者的瞳孔保持在透镜的出瞳距离之内(出瞳有时被称为eye box),投影矩阵和视图矩阵应该基于眼睛投影的实际中心(基于IPD),而不是基于透镜的出瞳中心.
如果观察者瞳孔超过了透镜的出瞳距离,将会产生畸变,这时HMD透镜的位置必须调整,或则更换镜片,然后光学系统重新计算,重新设置规格包含下面的内容

规格

(以下介绍的是最一般的情况,一个屏描述在OSVR配置文件中如何指定这些参数,见文章末尾的todo)
固定的矩形屏幕:矩形固定屏幕系统的规格是通过指定房间空间左下角,右下角以及左上角的坐标(单位)来完成的,单位为米.在从左下角到右下角和左上角的向量不正交的情况时,左上角坐标需要投影到左下角和右下角组成的平面上的垂直向量作为左上角(这将降低屏幕高度),这些坐标都以米为单位.
头戴显示器(HMD):头戴显示器设备里的屏幕可以安装在任何角度上,并且相对于设备和观察者的眼睛的任何相对位置.调整透镜的位置可以进一步改变屏幕图像的位置和大小,头戴显示器缺少统一的标准,头戴显示器和屏幕的位置没有坐标系统可以对这些进行明确的定义.
对于理想透镜的HMD设备,OSVR屏幕规格描述了屏幕的图像的边缘位置(相对于OSVR头部空间),OSVR头部空间:眼睛旋转中心之间的一半,X轴指向右边的眼睛,Y轴指向上方,Z轴指向头部的后方.每一个屏幕都包含一个单独的定义.虽然视图和投影矩阵依赖于观察者的IPD,但是屏幕的位置只依赖与透镜的位置和参数(假设观察者眼睛位于出瞳范围之内).对于每一个眼睛,屏幕通过三组3维坐标来指定:屏幕的左下角,右下角和左上角的图像信息.这些角是屏幕的图像的位置,即使这些位置经过透镜也不能被观察者看到(这使得校准变得具有挑战性,在以后的章节会讨论).对于固定的矩形屏幕,如果左下角到右下角的和左上角的矢量不会互相垂直,那么左上角坐标需要在左下角和右下角的平面上做投影.
这里写图片描述
OSVR屏幕配置文件中描述了畸变和曲面屏幕的参数,基本的畸变矫正方法是,将像素从物理显示屏上映射到矩形(或矩形子集)图像上,然后使用如上所述的矩形图像的三个角(也许这三个角是看不到的).
丢弃的设计:一些其他的屏幕表述方式考虑后丢弃了:(1)屏幕中心,屏幕方向,屏幕宽度和高度(指定方向困难而被舍弃)(2)屏幕的四个角(因为它进一步指定了几何图形而导致不一致的规格而被放弃).

横纵比

需要注意视口宽度和水平FOV的半宽度切线成比例,高度和垂直FOV成比例.这就意味着它们是一个非方型的横纵比,窗口的宽度和高度的比例不是直接和HFOV与VFOV成比例.这就意味着不能以显示大小的比例乘以乘以水平FOV来计算垂直FOV.
原文这里对上面这句话进行了举例说明(以OSVR HDK1.2和sensics dSight的HMD).个人理解是这样的:

weight:屏幕的宽度
height:屏幕的高度
HFOV:水平FOV
VFOV:垂直FOV

weight/HFOV = k2
height/VFOV = k1
如果K1=K2,那么VFOV = height/weight * HFOV.
但是K1往往都是不等于K2的(non-square),所以不能这么计算.只能通过规格参数来计算,如原文的计算过程,如果有兴趣可以算一下:

下面是HDK1.2计算的过程:

For example, the horizontal field of view on the OSVR HDK version 1.2 is 90 degrees and it covers half of the screen (1920/2). It is incorrect to compute the vertical field of view using 90 / (1920/2) * 1080 = 101.25 degrees. The correct calculation is atanDegrees( (tanDegrees(95/2) / (1920/2) * 1080) ) * 2 = 96.73 degrees. The diagonal field of view multiplies by the screen diagonal size in pixels (1445) rather than 1920/2 to get a diagonal field of view of 112.8 degrees.

For example, the Sensics dSight has a horizontal field of view of 95 degrees and a screen ratio of 1920x1080. It is incorrect to compute the vertical field of view using 95 / 1920 * 1080 = 53.43 degrees. The correct calculation is atanDegrees( (tanDegrees(95/2) / 1920 * 1080) ) * 2 = 63.1 degrees. The diagonal field of view multiplies by the screen diagonal size in pixels (2202.9) rather than 1920 to get a diagonal field of view of 102.8 degrees.

计算

小技巧:对于OSVR HDK1.3(通过HMD底部的小滑块调节光学向前,向后),显示屏的有效区域是120.96mm,每个半屏幕宽度是60.48mm.所以半屏幕的中间点是30.24mm.每个光学透镜从屏幕的中心到屏幕的垂直方向上是32mm.这样投影中心在X轴方向上,左眼是0.471,右眼是0.529

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值