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

Posted

技术标签:

【中文标题】OpenGL:关于处理碰撞检测和顶点数据的建议?【英文标题】:OpenGL : Suggestion on handling collision detection and vertex data? 【发布时间】:2012-05-18 03:20:10 【问题描述】:

我正在考虑如何在我的 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 游戏引擎如何处理这个问题?

【问题讨论】:

如果有效,那就是正确的。 我想知道这是否是最好的方法?我担心保留两个副本会导致数据冗余,并再次为碰撞检测测试创建临时副本。 【参考方案1】:

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

例如,您可能有:

描述几何图形的未转换顶点数据 渲染期间转换的顶点数据(可能由 GPU 完成) 用于碰撞检测的简化转换数据(例如 AABB 树) - 这比使用完全转换的顶点数据进行碰撞检测要高效得多! 在需要时,转换顶点数据以进行更详细的碰撞检测,但只有在您确定两个对象可能因 AABB 重叠而发生碰撞之后。您不想每帧对每个对象都这样做!

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

【讨论】:

以上是关于OpenGL:关于处理碰撞检测和顶点数据的建议?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL顶点缓冲区对象,我可以访问顶点数据以用于其他用途,例如碰撞检测吗?

2D 碰撞检测和 OpenGL 的东西

在 OpenGL 中的 3D 模型上创建 AABB

javascript运动系列第九篇——碰撞运动

在 OpenGL 中检测碰撞

四边形OpenGL之间的碰撞检测