从0开始制作游戏物理引擎(八)

本文述说了在SceneQuery场景下的加速结构BVH。

本文是SceneQuery的最后一篇文章。至此,所有的SceneQuery技术都已叙述完毕。

当然还有其他空间划分方法(SAP,OctTree,K-DTree等)。但这些一般用于模拟时的空间划分,等到模拟章节再说。

绝大部分理论来自于Erin Catto的GDC分享1(建议阅读)和PBRT[^1],而实现则参考PhysX5.4.0。

BVH构建更多的理论来源于渲染中光线追踪方向。其中有很多乱七八糟的BVH构建(在CPU上,或使用并行计算,或在GPU上构建)。本文不说那么多乱七八糟的,只说常用的方法。

从0开始制作游戏物理引擎(七)

本章说明了射线检测Raycast算法。

大部分Raycast都是使用向量方程的数值解直接得出,这种的公式大全1都有记载不再赘述。

本文主要叙述:

  1. 射线与凸多面体求交的Slab方法(Cyrus-Beck, Liang-Barsky和Kay-Kajiya)
  2. Gino编写的对任意凸体的Raycat算法的论文2解释。此算法也用来做任意凸体之间的Sweep算法。

C++原子内存序和MESI

在使用C++ atomic原子变量的时候,需要指定内存序(memory order),比如memory_order_relaxedmemory_order_acquire等。我一直没搞明白这些内存序是在做什么。这几天深入理解了一下于是写下这份文章。