39、3D 图形中的数学与软件模式及相关资源

3D 图形中的数学与软件模式及相关资源

在 3D 图形和虚拟现实领域,有多种数学方法和软件设计模式用于处理旋转、坐标系统转换以及场景管理等问题。下面将详细介绍这些内容。

旋转的表示方法

在单位球面上从一点插值到另一点时,可以使用球面线性插值(“slerp”)技术,而无需显式的旋转表示。以下是几种常见的旋转表示方法:
- 欧拉角(Euler angles) :欧拉角通过滚动(roll)、俯仰(pitch)和偏航(yaw)的组合来表示方向,这些值是相对于稳定的初始方向(即局部坐标)定义的:
- 滚动(Roll):绕局部 Z 轴的旋转。
- 俯仰(Pitch):绕局部 Y 轴的旋转。
- 偏航(Yaw):绕局部 X 轴的旋转。

欧拉角易于理解,对于编写从一个坐标系转换到另一个坐标系的代码也很方便。要将欧拉角转换为矩阵,需将三个标量值转换为绕各自轴的旋转,然后通过矩阵乘法将旋转矩阵连接起来。三个旋转矩阵有六种可能的排序,其中滚动 - 俯仰 - 偏航的排序较为常见。

旋转类型 描述
滚动(Roll) 绕局部 Z 轴旋转
俯仰(Pitch) 绕局部 Y 轴旋转
偏航(Yaw) 绕局部 X 轴旋转
graph LR
    A[欧拉角] --> B[转换为旋转矩阵]
    B --> C[矩阵乘法连接]
    C --> D[最终矩阵]
  • 四元数(Quaternions) :四元数是四维数学结构,使用实浮点数和虚浮点数的组合来表示定向参考框架。四元数通常写成 $Q = w + x i + y j + z k$ 的形式,其中 $i$、$j$ 和 $k$ 是独立的虚向量,$w$ 是实标量。绕单位向量 $(x, y, z)$ 旋转角度 $\theta$ 可以写成四元数形式:$Q = \cos(\theta/2) + \sin(\theta/2)(x i + y j + z k)$。单位四元数可以写成 4×4 旋转矩阵:
    [
    \begin{bmatrix}
    1 - 2y^2 - 2z^2 & 2xy - 2zw & 2xz + 2yw & 0 \
    2xy + 2zw & 1 - 2x^2 - 2z^2 & 2yz - 2xw & 0 \
    2xz - 2yw & 2yz + 2xw & 1 - 2x^2 - 2y^2 & 0 \
    0 & 0 & 0 & 1
    \end{bmatrix}
    ]

四元数具有有趣的数学性质,例如两个四元数相乘可以得到第三个四元数,但乘法运算不满足交换律。与矩阵相比,四元数只需要 4 个浮点数存储,并且总是可逆的。

  • 球面线性插值(“slerp”) :球面线性插值是一种在单位球面上两点之间实现匀速线性插值的方法,可用于虚拟相机绕空间中固定点旋转等操作。给定单位球面上的两点 $P_1$ 和 $P_2$,找到从原点到这两点的向量之间的角度 $\theta$,则 slerp$(P_1, P_2, t)$ 定义为:
    [
    \text{slerp}(P_1, P_2, t) = \frac{\sin((1 - t)\theta)}{\sin(\theta)}P_1 + \frac{\sin(t\theta)}{\sin(\theta)}P_2
    ]

当 $t$ 从 0 到 1 变化时,该公式将沿着单位球面上的最短路径平滑地线性插值一个点。需要注意的是,如果两点 $P_1$ 和 $P_2$ 在单位球面上正好相对($P_1 = -P_2$),则 $\theta = 0$,会导致 slerp 表达式中出现除零错误,此时不能使用 slerp。slerp 也可用于四元数的插值,能实现从一个四元数到另一个四元数的平滑线性旋转,对相机过渡效果非常有效。

软件设计模式
  • 场景图(Scene graph) :场景图是一种常见的软件设计模式,常用于显示嵌套对象场景的 3D 应用程序中。场景图通过有向树数据结构存储和访问场景中的所有对象,每个节点都与一个矩阵变换相关联。渲染节点上的对象时,其顶点通过树中该节点上方所有节点的变换矩阵的级联乘法进行变换。例如,机器人的手的几何形状相对于手臂定义,手臂又相对于身体定义,整个场景的组装可以用场景图表示。叶子节点的累积变换是其变换矩阵与树中每个先前父节点的有序级联矩阵相乘的结果。
graph TD
    A[机器人] --> B[躯干]
    B --> C[手臂]
    C --> D[手]
    A --> E[腿]
  • 矩阵栈(Matrix stack) :矩阵栈是与场景图实现相关的常见软件设计模式,其行为类似于经典栈,但经过修改以简化矩阵数学的最常见用例。矩阵栈的 API 通常包含以下方法:
    • void push(Matrix) :将新矩阵压入栈顶,其值等于当前栈顶矩阵与新矩阵的乘积。
    • Matrix pop() :移除栈顶元素。
    • Matrix peek() :返回当前栈顶元素,如果栈为空则返回单位矩阵。

矩阵栈在几何形状相对于其他场景元素定义时特别有用,并且经常与场景图结合使用。其优点是可以缓存多次使用的矩阵乘积,减少计算量。例如,在机器人有四个手臂的情况下,$(T_{robot} \cdot T_{torso})$ 的乘积只需要计算一次。

graph LR
    A[初始栈] --> B[push(Trobot)]
    B --> C[push(Ttorso)]
    C --> D[循环:push(Tarm)]
    D --> E[渲染手臂]
    E --> F[pop()]
    F --> G[pop(Ttorso)]
  • 模型视图(Modelview) :可以将相机视为场景中的一个元素,存储相机的局部到世界变换。常见的设计模式是将世界的最终原点从全局坐标重新定义为相对于相机的坐标,即让世界以相机为中心。在矩阵栈框架中,这可以通过将栈底矩阵设置为世界到相机的变换矩阵(即相机变换的逆矩阵)来实现。这个矩阵同时包含视图的(逆)变换和场景中堆叠在其上的所有模型的变换,这就是模型视图矩阵的由来。在这种模式中,经常会提到当前模型视图矩阵,即当前栈顶的矩阵。在 OpenGL 3.3 版本之前,提供了维护和操作矩阵栈的 API,包括专门用于模型视图栈的栈,但在 3.3 版本中该栈方法被弃用,在 4.3 版本中完全移除。如今,许多应用程序会重现旧的矩阵栈功能或使用相关库来实现。
相关资源推荐

在虚拟现实、3D 图形、用户界面设计等领域,有许多有价值的书籍、研究论文和网站资源可供参考:
- 3D 图形编程
- 《Fundamentals of Computer Graphics》,作者 P. Shirley、M. Ashikhmin 和 S. Marschner。
- 《Computer Graphics: Principles and Practice》,作者 J. D. Foley、A. van Dam、S. K. Feiner 和 J. F. Hughes。
- OpenGL
- 《The OpenGL Programming Guide: The Official Guide to Learning OpenGL, Version 4.3》,作者 D. Shreiner、G. Sellers、J. M. Kessenich 和 B. M. Licea - Kane。
- 《OpenGL SuperBible》,作者 G. Sellers、R. S. Wright 和 N. Haemel。
- 《OpenGL Insights》,作者 P. Cozzi 和 C. Riccio。
- Shadertoy 网站:shadertoy.com
- Anton’s OpenGL 4 Tutorials:antongerdelan.net/opengl
- 《The GPU Gems 系列》,多位作者。
- Rift 开发
- Oculus Best Practices Guide:developer.oculus.com/documentation
- 晕动病/模拟器病
- 《Textbook of Maritime Medicine》,挪威海事医学中心(2013 年),第 20 章“Motion Sickness”(textbook.ncmm.no)。
- 《Validating an Efficient Method to Quantify Motion Sickness》,作者 B. Keshavarz 和 H. Hecht(2011 年)。
- 《Simulator Sickness Questionnaire》,作者 R. S. Kennedy、N. E. Lane、K. S. Berbaum 和 M. G. Lilienthal(1993 年)。
- 《Motion Sickness Susceptibility Questionnaire Revised and Its Relationship to Other Forms of Sickness》,作者 J. F. Golding(1998 年)。
- VR 用户界面设计
- 《3D User Interfaces: New Directions and Perspectives》,作者 D. A. Bowman、S. Coquillart、B. Froehlich、M. Hirose 等。
- 《Design and Evaluation of Mouse Cursors in a Stereoscopic Desktop Environment》,作者 L. Schemali 和 E. Eisemann(2014 年)。
- 《Developing Virtual Reality Games and Experiences》,GDC 2014 演讲。
- 《Egocentric Object Manipulation in Virtual Environments: Empirical Evaluation of Interaction Techniques》,作者 I. Poupyrev、S. Weghorst、M. Billinghurst 和 T. Ichikawa(1998 年)。
- 《Kinect Hand Detection》,作者 G. Gallagher。
- 《Make It So: Interaction Design Lessons from Science Fiction》,作者 N. Shedroff 和 C. Noessel。
- 《Lessons learned porting Team Fortress 2 to virtual reality》。
- 《Pointing at 3D Target Projections with One - Eyed and Stereo Cursors》,作者 R. J. Teather 和 W. Stuerzlinger(2013 年)。
- 《Pointing to the future of UI》,作者 J. Underkoffler(2010 年)。
- 《Selection Using a One - Eyed Cursor in a Fish Tank VR Environment》,作者 C. Ware 和 K. Lowther(1997 年)。
- 《Usability Engineering》,作者 J. Nielsen。
- 《VR Lessons Learned: A Post - mortem》,Marauder Interactive 关于 Enemy StarFighter 的文章。
- 《Marvel’s Agents of S.H.I.E.L.D – T.R.A.C.K.S.》(第一季第 13 集)。
- 《World Builder》,作者 B. Branit(2007 年)。
- Unity
- Unity 官方网站:unity3d.com
- Unity 文档、教程和培训:unity3d.com/learn
- 《Unity in Action》,作者 J. Hocking。

值得一看的 VR 演示、游戏和应用程序
  • Tuscany ,Oculus 出品。
  • Team Fortress 2
  • EVE Online
  • Don’t Let Go! ,Skydome Studios 出品。
  • Chicken Walk ,Mechabit Ltd. 出品。
  • GiganotosaurusVR ,Meld Media 出品。
  • Jerry’s Place ,Greg Miller 出品。
  • Private Eye
  • Shadow Projection
  • Spaceflight VR
  • Strike Suit Zero
  • Technolust ,Iris Productions 出品。
  • Titans of Space ,DrashVR 出品。
  • Trial of the Rift Drifter ,Aldin Dynamics 出品。

此外,Oculus Share(share.oculusvr.com)是官方的 Oculus 开发者门户,可上传游戏、技术演示和实验,值得关注,新内容会定期添加。

术语表

以下是虚拟现实开发中常见术语的解释:
| 术语 | 解释 |
| ---- | ---- |
| 6DOF | “六自由度”的常见缩写,指能够在三个旋转轴(偏航、俯仰、滚动)和三个空间轴(X、Y、Z)上移动和感知位置的设备。 |
| 增强现实(Augmented Reality) | 使用计算设备扩展和增强周围现实世界数据的新兴领域,如能叠加用户所看内容信息的眼镜,或电影《钢铁侠》中托尼·斯塔克的平视显示器。 |
| 增强虚拟现实(Augmented Virtual Reality) | 在虚拟现实环境中使用增强现实的视觉主题,如视频游戏中的 HUD,适合将现实世界视频和其他流媒体内容融合到 Rift 应用程序中。 |
| 桶形畸变(Barrel Distortion) | 枕形畸变的数学逆变换,在桶形畸变中,通常为直线的线条向外弯曲。 |
| 色差(Chromatic Aberration) | 由透镜无法将不同频率的光弯曲相同程度而导致的一种畸变,蓝光比绿光弯曲角度大,绿光比红光弯曲角度大,这是棱镜能将白光分解成光谱的特性。 |
| 准直光(Collimated Light) | 光线已平行排列的光,如激光,准直光不汇聚,被描述为“汇聚于无穷远”,Oculus Rift 使用高质量透镜将屏幕发出的光准直。 |
| 坐标系(Coordinate System) | 在三维坐标系中,三个坐标 [X, Y, Z] 通过点到原点 [0, 0, 0] 的距离来定位点,在 Rift 的初始参考框架和 OpenGL 图形中,X 轴通常测量左右方向,Y 轴通常测量高度或海拔,Z 轴通常测量前后方向。 |
| 过场动画(Cutscene) | 游戏中用于在无玩家直接交互的情况下传达故事的长期手段,玩家停止游戏,观看游戏内的小电影,可能是有真人演员的片段、渲染的 CGI 动画或游戏引擎中的预录制动画等。 |
| 欧拉角(Euler angles) | 代表滚动、俯仰和偏航的三个角度,结合固定的评估顺序,这些值描述参考框架的方向。 |
| 头部姿态(Head Pose) | 在 VR 应用程序中,头部姿态是头部相对于某个固定坐标系的方向和位置的组合。 |
| 头戴式显示器(HMD) | 即 Head - mounted display。 |
| 沉浸感(Immersion) | 用虚拟环境包围用户的艺术和技术,让用户感觉周围都是世界。 |
| 瞳距(Interpupillary Distance,IPD) | 眼睛瞳孔之间的距离。 |
| 延迟(Latency) | 两个相关事件之间的时间间隔,在 Oculus Rift 中,延迟是用户移动头部到视图更新以反映变化之间的时间间隔,也使用“运动到光子”这一术语。 |
| 局部坐标(Local Coordinates) | 相对于当前对象的原点和参考框架的坐标。 |
| 矩阵(Matrix) | 在计算机图形中,矩阵是一个数字矩形数组,最常见的是 4×4 矩阵。 |
| 矩阵栈(Matrix Stack) | 行为类似于经典栈的一种数据结构,经过修改以简化矩阵数学的最常见用例,常用于场景图或分层模型的上下文中。 |
| 模型视图矩阵(Modelview Matrix) | 确定虚拟相机在 3D 空间中位置和方向的矩阵,也可用于相对于相机定位场景中的单个项目。 |
| 晕动病(Motion Sickness) | 人们在实际运动与身体预期不匹配时感到不适的症状,在传统晕动病中,如乘车或乘船时,能感觉到运动但看不到。 |
| 原点(Origin) | 坐标为 [0, 0, 0] 的位置,所有其他位置都相对于该点定义,每个参考框架都有一个原点。 |
| 视差(Parallax) | 从两个不同角度观察对象时,对象位置的明显变化(如对象或观察者运动时)。 |
| 枕形畸变(Pincushion Distortion) | 使用透镜放大图像时发生的畸变,在枕形畸变中,通常为直线的线条向内弯曲。 |
| 俯仰(Pitch) | 绕 X 轴的旋转,使用 Rift 时,这是向前倾斜头部(看向地面)或向后倾斜头部(看向天空)的动作。 |
| 临场感(Presence) | 对令人信服的沉浸体验的本能反应,当沉浸感非常好时,身体会本能地对虚拟世界做出反应,就像它是真实世界一样。 |
| 投影矩阵(Projection Matrix) | 负责将 3D 空间中的点映射到透视中的矩阵,以便将其投影到平面(显示面板)上以产生看似 3D 的 2D 图像,投影矩阵隐式定义了具有给定视野的视锥体以及输出显示面板的宽高比。 |
| 本体感觉(Proprioception) | 对身体各部分相对位置以及当前所施加努力强度的感觉。 |
| 四元数(Quaternions) | 可以用于表示三维旋转变换的四维数学结构,虽然使用起来可能有困难,但比旋转矩阵更有效地存储任意旋转,四元数需要四个浮点数,而矩阵需要九个或十六个。 |
| 滚动(Roll) | 绕 Z 轴的旋转,使用 Rift 时,这是将头部向左或向右倾斜到一个肩膀的动作。 |
| 旋转矩阵(Rotation Matrix) | 描述方向变化而不改变位置或比例的 3×3 或 4×4 矩阵,能保持向量之间的相对角度。 |
| 缩放矩阵(Scale Matrix) | 描述大小变化而不改变位置或方向的 3×3 或 4×4 矩阵,如果缩放是均匀的(即三个轴都按相同程度缩放),则缩放将保持向量之间的相对角度,也可以独立地在三个轴上缩放对象。 |
| 场景图(Scene Graph) | 常用于显示嵌套对象场景的 3D 应用程序中的软件设计模式,通过有向树数据结构存储和访问场景中的所有对象,每个节点与一个矩阵变换相关联,可能与场景元素的几何形状相关联。 |
| 模拟器病(Simulator Sickness) | 专门由处于模拟或 VR 环境中引发的晕动病的另一个名称。 |
| 立体视觉(Stereoscopy) | 通过向每只眼睛传输不同图像来在双目视图中产生深度错觉的方法。 |
| 斜视(Strabismus) | 眼睛无法对齐的病症,这种错位可能导致立体盲(无法使用立体视觉看到 3D 效果)或复视,俗称斗鸡眼或外斜视。 |
| 变换(Transform) | 将空间中的位置从一个参考框架转换到另一个参考框架的方法,通常用 4×4 矩阵表示。 |
| 平移矩阵(Translation Matrix) | 表示空间中运动的 4×4 矩阵,平移会增加点的 X、Y 和 Z 坐标,同时保持向量之间的相对角度。 |
| 视动错觉(Vection) | 如果移动对象占据用户视野的大部分,用户将这种情况解释为自己未发起的自我运动时可能发生的一种自我运动错觉,经典例子是在火车站,附近火车移动时,人们看到火车移动并认为自己在移动。 |
| 辐辏(Vergence) | 双眼同时运动以实现双目视觉的动作。 |
| 视锥体(View Frustum) | 建模世界中可能出现在屏幕上的空间区域,即假定相机的视野,通常形状像截头金字塔。 |
| 虚拟现实(Virtual Reality,VR) | 可以模拟在现实世界或想象世界中物理存在的计算机生成环境。 |
| VR 病(VR Sickness) | 专门由处于 VR 环境中引发的晕动病的另一个名称。 |
| 世界坐标(World Coordinates) | 相对于全局原点定义的参考框架。 |
| 偏航(Yaw) | 绕 Y 轴的旋转,使用 Rift 时,这是将头部向左或向右转的动作。 |

3D 图形中的数学与软件模式及相关资源

旋转表示方法的应用场景分析

不同的旋转表示方法在实际应用中各有优劣,以下是它们的应用场景分析:
| 旋转表示方法 | 优点 | 缺点 | 应用场景 |
| ---- | ---- | ---- | ---- |
| 欧拉角 | 易于理解,方便编写坐标系转换代码 | 存在万向锁问题,旋转顺序影响结果 | 对旋转概念理解要求不高的场景,如简单的物体姿态调整 |
| 四元数 | 存储空间小,乘法运算可组合旋转,无万向锁问题 | 难以直观理解,计算相对复杂 | 需要频繁进行旋转变换和插值的场景,如动画制作、相机控制 |
| 球面线性插值(slerp) | 实现单位球面上的匀速插值,旋转平滑 | 两点相对时无法使用 | 虚拟相机的旋转、物体的平滑过渡动画 |

软件设计模式的协同工作

场景图、矩阵栈和模型视图这三种软件设计模式通常协同工作,以实现复杂的 3D 场景管理和渲染。以下是它们协同工作的流程:

graph LR
    A[场景图定义场景结构] --> B[矩阵栈管理变换矩阵]
    B --> C[模型视图矩阵调整视角]
    C --> D[渲染场景中的对象]

在这个流程中,场景图确定了场景中对象的层次结构和相对关系,矩阵栈用于存储和管理每个对象的变换矩阵,模型视图矩阵则将场景的视角调整到相机的位置和方向,最后进行场景的渲染。

相关资源的使用建议

对于不同阶段的开发者,推荐的资源使用方式有所不同:
- 初学者 :可以从《Fundamentals of Computer Graphics》《Unity in Action》等基础书籍入手,同时参考 Unity 官方的文档和教程,快速入门 3D 图形编程和开发。
- 有一定基础的开发者 :深入学习 OpenGL 相关的书籍,如《The OpenGL Programming Guide》《OpenGL SuperBible》,并结合 Shadertoy、Anton’s OpenGL 4 Tutorials 等在线资源,提升图形编程能力。
- 专业开发者 :研究《OpenGL Insights》《The GPU Gems 系列》等高级资源,关注最新的研究论文和技术动态,探索更复杂的图形算法和优化技巧。

VR 体验的优化建议

为了提升 VR 体验,减少晕动病的发生,可以从以下几个方面进行优化:
- 降低延迟 :选择低延迟的硬件设备,优化软件代码,确保从用户头部运动到画面更新的延迟尽可能小。
- 合理设计视野 :根据用户的舒适度和应用场景,合理设置视锥体的视野范围,避免过大或过小的视野导致不适。
- 优化运动效果 :采用平滑的运动过渡和插值算法,避免突然的加速、减速或方向改变,减少运动与视觉的不协调。
- 提供视觉参考 :在虚拟场景中提供一些固定的视觉参考物,帮助用户建立空间感和方向感,减轻晕动病的症状。

未来发展趋势

随着技术的不断发展,3D 图形和虚拟现实领域呈现出以下几个发展趋势:
- 硬件性能提升 :更高分辨率的显示器、更精确的追踪设备和更快的处理器将进一步提升 VR 体验的质量和沉浸感。
- 融合现实技术 :增强现实和虚拟现实的融合将成为未来的发展方向,实现更加自然和无缝的交互体验。
- 人工智能应用 :人工智能技术将在 3D 图形渲染、场景生成和交互设计中发挥重要作用,提高开发效率和用户体验。
- 云服务支持 :云渲染和云存储技术的发展将使得开发者能够更轻松地处理大规模的 3D 数据和复杂的计算任务。

总之,3D 图形中的数学与软件模式以及相关资源为虚拟现实和 3D 应用的开发提供了坚实的基础。开发者需要根据具体的需求和场景,选择合适的旋转表示方法和软件设计模式,合理利用相关资源,不断优化 VR 体验,以适应未来技术的发展趋势。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值