OpenGL:关于处理碰撞检测和顶点数据的建议?

OpenGL:关于处理碰撞检测和顶点数据的建议?,opengl,graphics,3d,collision-detection,Opengl,Graphics,3d,Collision Detection,我在考虑如何在OpenGL应用程序中进行碰撞检测,并得出结论,我应该保留两份几何数据的副本 1) 第一个副本:仅用于OpenGL渲染目的。可以将其保存为VBO顶点索引。(保存在GPU中?) 2) 第二个副本:我保存在客户端(在类中,例如3DEntity),我执行所有测试,包括边界框碰撞测试、光线投射、 因此,在加载网格数据(比如从OBJ文件)后,首先准备“第一个副本”,然后使用“顶点索引”准备“第二个副本”。 (例如:如果我的网格是一个简单的立方体,我的“第一个副本”将有8个顶点,并使用顶点索引

我在考虑如何在OpenGL应用程序中进行碰撞检测,并得出结论,我应该保留两份几何数据的副本

1) 第一个副本:仅用于OpenGL渲染目的。可以将其保存为VBO顶点索引。(保存在GPU中?)

2) 第二个副本:我保存在客户端(在类中,例如3DEntity),我执行所有测试,包括边界框碰撞测试、光线投射、

因此,在加载网格数据(比如从OBJ文件)后,首先准备“第一个副本”,然后使用“顶点索引”准备“第二个副本”。 (例如:如果我的网格是一个简单的立方体,我的“第一个副本”将有8个顶点,并使用顶点索引来正确渲染它。但我的“第二个副本”将总共有36个顶点。因为我必须在三角形上进行光线投射)

我在“3d实体”中保留一个变换矩阵,以保持“3d实体”的位置、旋转等状态。 所以在psuedo代码中

class 3DEntity {
 Vertex[] verticesForPhysics;
 Matrix tranformationMatrix;
}
我将“verticesForPhysics”的值保持不变(也就是说,它始终在模型坐标系中)。因此,当我想要移动、旋转实体时,我只需更改“transformationMatrix”

在进行碰撞检测之类的测试时,我通过将“verticesForPhysics”乘以“transformationMatrix”以世界坐标表示顶点,再次创建顶点的临时副本

Vertex[] verticesForPhysicsInWorld=transformationMatrix * verticesForPhysics;
现在我使用这些“verticesForPhysicsInWorld”进行测试

这是正确的处理方法吗? 我担心数据冗余,因为我保留了两个副本,并为碰撞检测测试制作了另一个临时副本。
其他OpenGL游戏引擎如何处理这个问题?

拥有多个顶点数据副本是很正常的,所以不用担心:-)

例如,您可能有:

  • 描述几何体的未转换顶点数据
  • 渲染期间转换的顶点数据(可能由GPU完成)
  • 用于碰撞检测的简化转换数据(例如AABB树)-这比使用完整转换顶点数据进行碰撞检测要高效得多
  • 需要时,变换顶点数据以进行更详细的碰撞检测,但仅在确定两个对象可能由于AABB重叠而发生碰撞之后。您不希望对每个对象每帧执行此操作

请注意,用于物理的顶点数据/几何体与用于渲染的顶点数据/几何体不同也是很常见的。通常,您可以使用更简单的对象进行碰撞检测(例如球体、圆柱体)

如果它有效,那么它是正确的。我想知道这是否是最好的方法?我担心数据冗余,因为我保留了两个副本,然后又为碰撞检测测试创建了临时副本。