Unity3D for VR 学习(6): 再次温故知新-3D数学

2016年02月16日 12:09 0 点赞 0 评论 更新于 2025-11-21 19:50

一年前,我系统学习过 3D 数学,并记录了一篇博客《C# 程序员整理的 Unity 3D 笔记(十):Unity3D 的位移、旋转的 3D 数学模型》。如今一年过去,我决定再次温习相关知识。

坐标系

Unity3D 使用左手笛卡尔坐标系(Descartes coordinate system),主要包含以下几种坐标系:

  • 世界坐标系(world space):在一个游戏场景中,世界坐标系是唯一的,它为整个场景提供了一个统一的参考框架。
  • 物体坐标系(局部坐标系,localObject space):每个物体都有各自独立的坐标系。例如,在桌子的物体坐标系中,扶手相对于桌子腿的位置可以通过该坐标系来描述。有时候,使用物体坐标系可以避免对外暴露过多细节。
  • 摄像机坐标系:这是一种特殊的物体坐标系,用于定义物体是否在摄像机的视野范围内,即确定哪些物体会被摄像机绘制出来。
  • 惯性坐标系 (Intertial):这是一个“临时”坐标系,引入它是为了方便从世界坐标系到物体坐标系的转换。其原点与物体坐标系重合,坐标轴平行于世界坐标系。

Unity3D 提供的坐标系转换工具

1. RectTransformUtility

  • Vector2 WorldToScreenPoint(Camera cam, Vector3 worldPoint):该方法用于将世界坐标转换为屏幕坐标。
  • Ray ScreenPointToRay(Camera cam, Vector2 screenPos):此方法根据屏幕上的点生成一条射线。

2. 《Unity3D 项目实战笔记(1):prefab 的插件方式》中的坐标转换应用

下面的代码展示了如何实现动态定位。假设要将 a.prefab 加载到 A 的子节点下面,并使其显示在 b 点位置,有两种方法:一种是把 a 挂接到 B 下;另一种是使用 transform 提供的两个方法,将局部坐标转换为世界坐标。

Vector3 pos = A.transform.TransformPoint(a.localPosition);
b.localPosition = B.transform.InverseTransformPoint(pos);

向量(Vector)

向量具有大小和方向,但没有位置。任意一点都可以从原点开始用向量来表示,这也是点和向量容易让初学者混淆的地方。由于向量与位置无关,所以它可以在坐标系中的任何地方使用。向量有以下几种常见运算:

  • 向量数乘:通过标量和向量相乘,可以实现力的系数调节。
  • 向量标准化:将向量的大小变为 1,标准化后的向量也称为“法线”。
  • 负向量:与原向量大小相等,但方向相反。
  • 向量加法:向量 a 和向量 b 首尾相连,从 a 的尾到 b 的头的向量即为它们的和。
  • 向量减法:其原理与向量加法类似。
  • 向量点乘(内积):结果为标量,用于描述两个向量的“相似”程度。点乘结果越大,两个向量越接近。具体来说:
  • a·b > 0 时,两向量夹角在 [0, 90°) 范围内,方向大致相同。
  • a·b = 0 时,两向量夹角为 90°,即向量正交。
  • a·b < 0 时,两向量夹角在 (90°, 180°] 范围内,方向相反。
  • 向量叉乘(叉积):结果为一个垂直于原来两个向量的向量。

矩阵(Matrix)

这里主要讨论 22、33、4*4 的方阵。DirectX 使用行向量,而 OpenGL 使用列向量,方阵的行可以被解释为基向量。

  • 线性变换与仿射变换:线性变换保持直线和平行线,且原点位置不会发生改变;仿射变换是在线性变换的基础上再进行平移操作。
  • 矩阵的行列式:矩阵的行列式结果为一个标量。
  • 正交矩阵:如果矩阵是正交的,那么它与自己的转置矩阵相乘,结果为单位矩阵。由此可知,正交矩阵的转置矩阵就是它的逆矩阵。
  • 投影变换
  • 正交投影(降维操作):也称作平行投影,例如将 3D 场景投影到 2D 屏幕上,这个投影平面就是我们看到的屏幕。
  • 透视投影:投影线不再平行,而是相交于一点——投影中心,类似“小孔成像”,投影出来的图像是倒着的。

方位表示方法

  • 欧拉角:使用三个角度来保存方位,分别是 heading(绕 Y 轴旋转,取值范围为 (-180°, 180°))、pitch(绕 X 轴旋转,取值范围为 (-90°, 90°))和 bank(绕 Z 轴旋转,取值范围为 (-180°, 180°))。
  • 四元数(Quation):用 4 个数字来表达方位,它避免了欧拉角存在的“万向锁”和 Slerp 球形差值问题。

参考书籍

  • 《3D 数学基础:图形与游戏开发》
  • 《Mathematics for 3D Game Programming and Computer Graphics》

关于 VR 设备的体验

最后,我想分享一下对 VR 设备的体验。暴风魔镜 4 搭配小米 Note 顶配 2K 屏具有里程碑意义,其分辨率和陀螺仪表现都很不错,我可以连续玩 VR 超过 20 分钟。相比之下,千元机魅蓝 Note 2 在 VR 体验方面表现不佳。所以,如果要玩 VR,建议远离千元机。

展望 VR 的未来,它或许能弥补一些小小的遗憾。比如 5 年前,我多次出差到哈尔滨,当时很想去冰雪大世界看看,但由于畏惧 -35° 的寒冷天气而未能成行。如果未来能通过 VR 实现远程观看,那将再好不过了。

作者信息

洞悉

洞悉

共发布了 3994 篇文章