OpenGL : Suggestion on handling collision detection and vertex data?

标签 opengl graphics 3d collision-detection

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

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

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

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

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

class 3DEntity {
 Vertex[] verticesForPhysics;
 Matrix tranformationMatrix;
}

我保持“verticesForPhysics”值固定。(意味着,它始终位于模型坐标系中)。因此,当我想要移动、旋转我的实体时,我只需更改“transformationMatrix”即可。

在进行碰撞检测等测试时,我通过将“verticesForPhysics”乘以“transformationMatrix”再次制作顶点的临时副本,给出世界坐标中的顶点。

Vertex[] verticesForPhysicsInWorld=transformationMatrix * verticesForPhysics;

现在我使用这些“verticesForPhysicsInWorld”进行测试。

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

最佳答案

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

例如,您可能有:

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

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

关于OpenGL : Suggestion on handling collision detection and vertex data?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10646280/

相关文章:

c - "Couldn' 找不到匹配的渲染驱动程序!”来自 SDL_CreateRenderer()?

r - 使用 sjPlot 从 glmer 模型中绘制随机斜率

java - JFrame + JOGL 仅在调整大小或最小化 + 最大化时显示内容

android - 在 Canvas 上绘制 2 个圆圈

r - 在 R rgl 轴标签中使用 "expression"

javascript - 在 HTML5 Canvas 上创建立体 3D 图像

c++ - 边界框视锥体渲染 - 距离渲染 - OpenGL

c++ - 如何将 VS、C++、OpenGL 应用程序部署到第二台计算机?

c++ - 如何从 ID3DXEffect 获取所有着色器常量(统一)?

opengl - 如何在 OpenGL GLSL 中导入库