C++ 使用 Obj 模型的碰撞

C++ Collision using Obj Models

本文关键字:碰撞 模型 Obj 使用 C++      更新时间:2023-10-16

我正在试验OpenGL 3.2+,并开始在3D中加载Obj文件/模型并尝试与它们进行交互。(以下教程来自本网站等来源)

我想知道在不使用第三方物理引擎等的情况下在两个现有(加载的)Obj 对象/模型之间设置碰撞检测的最简单方法(如果可能的话)是什么?

可以满足您条件的最简单算法可以检测球体之间的碰撞,从而结束您的网格。在这里,您可以看到实现示例。

最简单的碰撞模型是使用边界框进行碰撞。原理很简单:你用一个由最小和最大两点定义的框包围你的对象。然后使用这些点来确定两个框是否相交。

在我的引擎中,边界框的结构和碰撞检测方法设置为:

typedef struct BoundingBox
{
    Vector3 min; //Contains lowest corner of the box
    Vector3 max; //Contains highest corner of the box
} AABB;
//True if collision is detected, false otherwise
bool detectCollision( BoundingBox a, BoundingBox b )
{
    return (a.min <= b.max && b.min <= a.max);
}

另一种简单的方法是使用球体。此方法对于所有维度大小相似的对象很有用,但如果不是,则会产生大量错误碰撞。在这种方法中,你用半径radius和中心位置position的球体包围你的对象,当涉及到碰撞时,你只需检查中心之间的距离是否小于半径的总和,并且两个球体相交的情况。

同样,来自我的引擎的代码片段:

struct Sphere
{
    Vector3 position;   //Center of the sphere
    float radius;       //Radius of the sphere
};
bool inf::physics::detectCollision( Sphere a, Sphere b )
{
    Vector3 tmp = a.position - b.position; //Distance between centers
    return (Dot(tmp, tmp) <= pow((a.radius + b.radius), 2));
}

在上面的代码中,Dot()计算两个向量的点积,如果你用它本身点向量,它会给你(根据定义)向量的平方大小。请注意,我实际上并没有平方根来获得实际距离,而是比较正方形以避免额外的计算。

您还应该意识到,这两种方法都不是完美的,并且会不时为您提供错误的碰撞检测(除非对象是完美的盒子或球体),但这是简单实现和计算复杂性的权衡。尽管如此,这是开始检测碰撞的好方法。