一文搞懂什么VR,什么是6Dof,欧拉角,四元数转视图矩阵

目录

一、什么是VR

二、什么是3Dof,6Dof, 9Dof

三、欧拉角(姿态角)

四、Android手机的欧拉角与坐标系

五、安卓坐标系转换欧拉角

六、根据姿态四元数求视图矩阵

一文搞懂什么VR,什么是6Dof,欧拉角,四元数转视图矩阵_AppNinja 开发手记-CSDN博客

一、什么是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个自由度中平移:向前/向后,向上/向下,向左/向右。

### 将3D齐次坐标矩阵换为6DOF姿态表示 为了实现从3D齐次坐标矩阵到六自由度(6DOF)姿态表示的换,可以遵循以下方法: #### 提取旋和平移分量 给定一个4×4的齐次变换矩阵 \( H \),其形式如下所示[^1]: \[H=\begin{bmatrix} R & T \\ 0 & 1\end{bmatrix}\] 这里, - 左上角的3×3子矩阵\( R \)代表了物体的姿态部分中的旋成分; - 右侧一列向量\( T=[t_x,t_y,t_z]^T \)则对应着位置上的平移。 因此,可以直接获取这六个参数作为最终的结果——三个用于描述方位变化的角度以及另外三个用来指明空间内移动距离的数据项。然而需要注意的是,在实际应用当中我们通常不会直接把旋矩阵里的数值当作欧拉角来解释;而是会通过特定算法将其化为更易于理解和使用的表达方式,比如四元数或者轴角对等形式之一再进一步处理成期望得到的标准6DOF格式。 对于将旋矩阵为其他类型的旋表述,常用的方法有: - **欧拉角**:虽然直观但是存在万向锁问题。 - **四元数**:避免了奇异性,并且计算效率较高。 - **旋向量/轴角**:由一个单位方向矢量加上绕该轴动角度组成。 下面给出一段Python代码示例,展示如何提取并打印出这些信息: ```python import numpy as np def homogeneous_to_6dof(homogeneous_matrix): """ Convert a 4x4 homogeneous transformation matrix to 6DOF pose representation. Args: homogeneous_matrix (numpy.ndarray): A 4x4 numpy array representing the homogeneous transform. Returns: tuple: Two elements, first being rotation represented by quaternion, second is translation vector [tx ty tz]. """ # Extracting Rotation Sub-matrix and Translation Vector from Homogeneous Matrix r = homogeneous_matrix[:3, :3] t = homogeneous_matrix[:3, 3] # Converting Rotation Matrix into Quaternion Formulation trace_r = np.trace(r) q_w = 0.5 * np.sqrt(max(0., 1 + trace_r)) q_xyz = 0.5 * np.array([ np.sign(r[2][1]-r[1][2]) * np.sqrt(abs(1 + r[0][0] - r[1][1] - r[2][2])), np.sign(r[0][2]-r[2][0]) * np.sqrt(abs(1 - r[0][0] + r[1][1] - r[2][2])), np.sign(r[1][0]-r[0][1]) * np.sqrt(abs(1 - r[0][0] - r[1][1] + r[2][2])) ]) quat = np.concatenate(([q_w], q_xyz)) return quat.tolist(), t.tolist() if __name__ == "__main__": h_mat_example = np.eye(4) six_dof_pose = homogeneous_to_6dof(h_mat_example) print(f"Rotation (as Quaternion): {six_dof_pose[0]}") print(f"Translation: {six_dof_pose[1]}") ``` 此函数接收一个4×4大小的齐次变换矩阵作为输入,并返回两个列表组成的元组,第一个列表包含了以四元数形式表示的空间朝向数据,而第二个则是简单的三维直角坐标系下的位移值集合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AppNinja

你的鼓励是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值