什么VR,什么是6Dof,欧拉角,四元数转视图矩阵
目录
一、什么是VR
VR是把一个有透镜成像功能的显示器罩在眼睛上,人向哪里看,就在显示器里显示对应方向的景物画面,从而让人感觉自己身处一个无限大的虚拟空间中。
这个功能的实现由以下几部分基础结构组成:
1.处理器
处理器即计算的核心,用来计算和生成图像,并根据陀螺仪数据计算你的姿态定位等。为了防止速度不同步导致的眩晕,VR设备要求图像刷新率达到90Hz,这种情况下就对处理器的运算速度要求很高。所以,一般来说,好的VR设备处理器芯片性能指标至关重要。
2. 显示器
分别向左右眼睛显示图像。一般当我们说 2k 屏幕的VR眼镜时,是指一整块屏幕的长边的尺寸,比如 2k*1k 尺寸。但如果说:单眼2k,则是指屏幕短边的尺寸是2k。目前市场上主流的配置是 单眼1.5k左右。屏幕分辨率越高,要求配备的处理器也越强大。
3. 透镜
如果把显示器直接贴在人眼前,人眼是没办法看清楚这么近距离影响的,因此VR设备中凸透镜片的意义,就是通过折射光线,将显示器上的画面成像拉近到视网膜位置,使人的眼睛能轻松看清几乎贴在眼前的显示屏。
4. 陀螺仪
如果要让VR设备显示器里的景象随着人头部的运动而实时发生变化,则必须要知道头部的朝向。例如,当你穿戴着VR设备向上看时,眼睛里的显示器,需要向你实时地显示虚拟世界中的天空,当你回头时,显示器则需要向你展示身后的景象,模拟真正的回头。而VR设备如何检测你这个“向上看”的动作呢?这就需要陀螺仪来配合了。具体陀螺仪的原理这里暂不展开介绍,大家只要知道,它可以用来检测人(物体)在空间中的姿态和朝向即可。
当日,仅仅有360°的显示是不够的,VR设备之所以带给我们超强的沉浸感,是由于你不仅能够看到全方位的虚拟景象,还能够通过VR设备与虚拟的景象实时地发生交互,这才是VR游戏真正的魅力所在。
根据可交互程度的不同,我们常常听到把VR设备中涉及到的3DOF和6DOF等说法。
dof:degree of freedom,即自由度。
其中3dof是指有3个转动角度的自由度,而 6dof 是指,除了3个转动角度外,再加上 上下、前后、左右等3个位置相关的自由度。
因此,当我们说 3dof的VR眼镜或VR设备时,是指该VR设备可以检测到头部向不同方向的自由转动,但是不能检测到头部的前后左右的空间位移。而6dof的VR设备(眼镜),则除了检测头部的转动带来的视野角度变化外,还能够检测到由于身体移动带来的上下前后左右位移的变化。
用一张更为形象的图解释就容易理解了:
3DOF的VR设备一般可以用来看VR电影,而要达到玩游戏时与场景中的交互,则需要能够支持6DOF的VR设备,这样我们才能够在游戏里体验到跨越障碍、躲避子弹和怪兽、以及跳楼、登山、滑雪等超级真实的感受。
二、什么是3Dof,6Dof, 9Dof
自由度(DoF)与刚体在空间内的运动相关,可以解释为“物体移动的不同基本方式”。
自由度总共有6个,可分成两种不同的类型:平移和旋转。
#1
平移运动
Translational motion
刚体可以在3个自由度中平移:向前/向后,向上/向下,向左/向右。
#2
旋转运动
Rotary motion
刚体也可以在3个自由度中旋转:
俯仰-纵摇(Pitch)、偏航航向-垂摇(Yaw)、横滚翻滚-横摇(Roll)。
飞机动画展示如下:
pitch():俯仰,将物体绕X轴旋转(localRotationX)
yaw():航向,将物体绕Y轴旋转(localRotationY)
roll():横滚,将物体绕Z轴旋转(localRotationZ)
因此,3种类型的平移自由度 3种类型的旋转自由度 = 6自由度!
旋转自由度3Dof在VR中的坐标轴如下所示:
在任意一个自由度中,物体可以沿两个“方向”自由运动。例如,电梯限制在1个自由度中(垂直平移),但电梯能够在这个自由度中上下运动。同样,摩天轮限制在1个自由度中,但这是旋转自由度,所以摩天轮能够朝相反的方向旋转。
我们可以继续举例子,比如说主题公园。碰碰车总共有3个自由度:它只能在3轴中的2条里平移(无法像电梯那样上下移动);然后它只能以一种方式旋转(无法像飞机那样纵摇和垂摇)。所以2个平移 1个旋转=3自由度。
无论有多复杂,刚体的任何可能性运动都可以通过6自由度的组合进行表达。例如在你用球拍击打网球的时候,球拍的复杂运动可以表示为平移和旋转的组合。
#3
惯性测量单元和自由度
nertial measurement unit and degrees of freedom
惯性测量单元(IMU)是一种通过传感器组合(加速度计、陀螺仪和磁力计)来测量和报告速度、方向和重力的电子设备。IMU过去的主要应用之一是作为飞机仪表设备,但现在它们已经应用于一系列电子设备,比如说智能手机。IMU的成本已经出现了大幅下降,映维网觉得我们今天可以认为3DoF定位问题已经得到了“解决”。但遗憾的是,IMU在实际应用中只能准确地测量和报告方向值(旋转),无法处理平移。
#4
九自由度是什么
Nine degrees of freedom
IMU的世界里出现了有趣的术语,比如一系列关于“9自由度”IMU的说法,但这令人相当困惑,因为自由度总共只有6个。
基本上,很多IMU厂商都生造了“9自由度”一词来推销他们的产品,但这都不是真正意义上的自由度。9自由度主要是IMU内每一个传感器所能测量到的自由度的总和。比如,如果IMU搭载了一个可以测量3自由度的加速度计,一个能测量3自由度的陀螺仪,以及一个能测量3自由度的磁力计,厂商就有可能将其称之为9自由度IMU(九轴)。但这与现实不符,因为这3个传感器所测量的是相同的3自由度(只有方向)。
一个9自由度IMU(九轴)可能比6自由度IMU(六轴)更好,因为它可以通过传感器融合(结合来自不同传感器的数据)来提高最终输出的质量。然而,这仍然无法测量平移。
三、欧拉角(姿态角)
莱昂哈德·欧拉用欧拉角来描述刚体在三维欧几里得空间的取向。对于任何参考系,一个刚体的取向,是依照顺序,从这参考系,做三个欧拉角的旋转而设定的。所以,刚体的取向可以用三个基本旋转矩阵来决定。换句话说,任何关于刚体旋转的旋转矩阵是由三个基本旋转矩阵复合而成的。
欧拉角 - 维基百科,自由的百科全书 (wikipedia.org)
三个欧拉角: ({\displaystyle \alpha ,\ \beta ,\ \gamma }蓝色的轴是xyz-轴,红色的轴是XYZ-坐标轴。绿色的线是交点线 (N)。
欧拉角动画
单位四元数,又称欧拉参数,提供另外一种方法来表述三维旋转。这与特殊酉群的描述是等价的。四元数方法用在大多数的演算会比较快捷,概念上比较容易理解,并能避免一些技术上的问题,如万向锁现象。因为这些原因,许多高速度三维图形程式制作都使用四元数。
四、Android手机的欧拉角与坐标系
在安卓的官方文档中,IMU的 坐标系是这样的:
手机定义的坐标系统:X轴是水平且指向右边,Y轴是垂直且指向前方,Z轴指向屏幕的正面正上方。
当手机左右摇摆时(绕 y 轴旋转),得到变化的 滚转角Φ(roll),范围为 (-90 to 90)
当手机前后摇摆时(绕 x 轴旋转), 得到变化的 俯仰角θ(pitch) ,范围为 (-180 to 180)当手机横屏转换成竖屏或竖屏转换成横屏时(绕 z 轴旋转),即得到变化的 偏航角ψ(yaw)。
安卓手机IMU坐标系
所以如果是后置摄像头的话,那么相机 轴与IMU 轴一致,相机 轴与 IMU 轴相反。相机 轴也与 IMU的 轴相反。其实就是有一个绕IMU 轴的180度旋转。
实际情况可能有一点误差,需要标定。当然相机坐标系和IMU坐标系除了旋转外,还有平移。这个平移量不同的手机也是不一样的。
五、安卓坐标系转换欧拉角
欧拉角是按照既定的顺序,如依次绕z,y,x分别旋转一个固定角度,使用roll,yaw ,pitch分别表示物体绕,x,y,z的旋转角度,可以完成一个坐标系转换成另一个坐标系。
但是在安卓中,这里的角度定义有所不同,原文如下:
Note: This definition is different from yaw, pitch and roll used in aviation where the X axis is along the long side of the plane (tail to nose).
也就是说,X轴与航空系统所定义的不同。安卓里的X轴是短边。
具体如下图:
注: 图中旋转方向只是示意方向,不是指定的正方向!!!
当手机坐标系与地球坐标系重合时,三个角度都为0。
- Azimuth:绕z轴旋转,磁北与y轴的夹角,顺时针增大,0到359度。
- Pitch:绕x轴旋转的角度,即手机上下旋转,y轴往z轴方向为正。-180到180度。
- Roll:绕y轴旋转的角度, 即手机的左右旋转,顺时针为正,-90到90度。
看一下getgetOrientation()方法,求出手机坐标系相对于世界坐标系三个轴的旋转角。
-
public static float[] getOrientation(float[] R, float[] values) {
-
/*
-
* 4x4 (length=16) case:
-
* / R[ 0] R[ 1] R[ 2] 0 \
-
* | R[ 4] R[ 5] R[ 6] 0 |
-
* | R[ 8] R[ 9] R[10] 0 |
-
* \ 0 0 0 1 /
-
*
-
* 3x3 (length=9) case://上篇文章讲到的旋转矩阵
-
* / R[ 0] R[ 1] R[ 2] \
-
* | R[ 3] R[ 4] R[ 5] |
-
* \ R[ 6] R[ 7] R[ 8] /
-
*
-
*/
-
if (R.length == 9) {
-
values[0] = (float) Math.atan2(R[1], R[4]);//azimuth
-
values[1] = (float) Math.asin(-R[7]);//pitch
-
values[2] = (float) Math.atan2(-R[6], R[8]);//roll
-
} else {
-
values[0] = (float) Math.atan2(R[1], R[5]);
-
values[1] = (float) Math.asin(-R[9]);
-
values[2] = (float) Math.atan2(-R[8], R[10]);
-
}
-
return values;
-
}
这里三个角的计算不大好理解,我画几个示意图大致讲一下我的看法。
还望大家一起讨论。
首先复习一下上一节R矩阵的内容:
-
R[0] = Hx; R[1] = Hy; R[2] = Hz;//【地球坐标系】X方向,指东
-
R[3] = Mx; R[4] = My; R[5] = Mz;//【地球坐标系】Y方向,指北
-
R[6] = Ax; R[7] = Ay; R[8] = Az;//【地球坐标系】Z反方向,向下
首先看azimuth,代码如下:
values[0] = (float) Math.atan2(R[1], R[4]);
也就是arctan2(Hy,My)。 Hy是【地球坐标系】指向东的单位向量在【手机坐标系】Y轴上的分量。
同样地,My是【地球坐标系】指向北的单位向量在【手机坐标系】Y轴上的分量。
azimuth是绕z轴旋转,磁北与y轴的夹角,顺时针增大,0到359度。这里用了atan2函数,因为atan只可以表示−90o到90o−90o到90o,atan2可以表示−180o到180o−180o到180o。具体详细的区别可以看这里。
示意图如下:
pitch的代码如下:
values[1] = (float) Math.asin(-R[7]);
也就是arcsin(-Ay).Ay是【地球坐标系】指向下(重力)的单位向量在【手机坐标系】Y轴上的分量。示意图如下:
roll的代码如下:
values[2] = (float) Math.atan2(-R[6], R[8]);
也就是arctan2(-Ax,Az).Ax【地球坐标系】指向下(重力)的单位向量在【手机坐标系】x轴上的分量。Az是【地球坐标系】指向下(重力)的单位向量在【手机坐标系】z轴上z的分量。
示意图如下:
这里需要指出的是,这个图的俯视方向是沿着y轴的正方向,所以本来是顺时针为正,这里是逆时针为负,所以也要加负号。
六、根据姿态四元数求视图矩阵
姿态解算3-四元数与旋转矩阵 - 知乎 (zhihu.com)
根据姿态四元数q0,q1,q2,q3求出视图矩阵。
(待续...)
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfibjee
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13