我正在考虑如何在我的 OpenGL 应用程序中进行碰撞检测,并得出结论,我应该保留我的几何数据的两份副本。
1)第一个副本:仅用于OpenGL渲染目的。这可以保存为VBO,顶点索引。(保存在GPU中?)
2)第二个副本:我保存在客户端(在一个类中,比如 3DEntity 中),我执行所有测试,包括边界框碰撞测试、光线投射、
因此,在我加载网格数据(比如从 OBJ 文件)之后,首先我准备“第一个副本”,然后使用“顶点索引”准备“第二个副本”。(例如:如果我的网格是一个简单的立方体,我的“第一个副本”将有 8 个顶点,并使用顶点索引来正确渲染它。但我的“第二个副本”将总共有 36 个顶点。因为我必须做 ray-铸造三角形)
我在“3DEntity”中保留了一个转换矩阵,以保持我的“3d Entity”的位置、旋转等状态。所以在伪代码中;
class 3DEntity {
Vertex[] verticesForPhysics;
Matrix tranformationMatrix;
}
我保持“verticesForPhysics”值固定。(意味着它始终在模型坐标系中)。所以当我想移动时,旋转我的实体我只需更改“transformationMatrix”。
在进行诸如碰撞检测之类的测试时,我再次制作了顶点的临时副本,方法是将“verticesForPhysics”乘以“transformationMatrix”,给出世界坐标中的顶点。
Vertex[] verticesForPhysicsInWorld=transformationMatrix * verticesForPhysics;
现在我使用这些“verticesForPhysicsInWorld”进行测试。
这是处理这个的正确方法吗?我担心通过保留两个副本并为碰撞检测测试制作另一个临时副本来担心数据冗余。其他 OpenGL 游戏引擎如何处理这个问题?