我在考虑如何在我的OpenGL应用程序中进行碰撞检测,并得出结论,我应该保留两份几何数据。
1)第一次复制:仅用于OpenGL渲染的purposes.This可以保存为VBO,顶点索引。
2)第二次复制:我保存在客户端(例如3 3DEntity类),执行所有测试,包括边界盒碰撞测试、光线投射测试、
因此,在加载网格数据(例如来自OBJ文件)之后,首先准备“第一个副本”,然后使用“顶点索引”准备“第二个副本”。(例如:如果我的网格是一个简单的立方体,我的“第一份拷贝”将有8个顶点,并使用顶点指数将其表示为properly.But我的“第二份副本”总共有36 vertices.Because,我必须在三角形上进行光线投射)
我在“3 3DEntity”中保留了一个转换矩阵,以保持我的"3d实体“的位置、Rotation..etc等状态。所以在psuedo代码中;
class 3DEntity {
Vertex[] verticesForPhysics;
Matrix tranformationMatrix;
}
我保持"verticesForPhysics“值不变。(意思是,它总是在模型坐标系中).So当我想移动时,旋转我的实体,我只需更改"transformationMatrix”。
在进行碰撞检测等测试时,我再次复制顶点,将"verticesForPhysics“与"transformationMatrix”相乘,给出世界坐标中的顶点。
Vertex[] verticesForPhysicsInWorld=transformationMatrix * verticesForPhysics;
现在,我使用这些"verticesForPhysicsInWorld“进行测试。
这是正确的处理方法吗?我担心数据冗余,因为我保留了两个副本,并为碰撞检测测试制作了另一个临时副本。其他OpenGL游戏引擎如何处理这个问题?
发布于 2012-05-17 21:27:32
拥有多个顶点数据副本是非常正常的,所以不要担心:-)
例如,您可能有:
在呈现过程中描述geometry
请注意,用于物理的顶点数据/几何图形与用于绘制的顶点数据/几何图形是不同的,这也是很常见的。通常你可以用更简单的物体来进行碰撞检测(例如球体、圆柱体)。
https://stackoverflow.com/questions/10646280
复制