C++ 使用 Obj 模型的碰撞
C++ Collision using Obj Models
我正在试验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()
计算两个向量的点积,如果你用它本身点向量,它会给你(根据定义)向量的平方大小。请注意,我实际上并没有平方根来获得实际距离,而是比较正方形以避免额外的计算。
您还应该意识到,这两种方法都不是完美的,并且会不时为您提供错误的碰撞检测(除非对象是完美的盒子或球体),但这是简单实现和计算复杂性的权衡。尽管如此,这是开始检测碰撞的好方法。
相关文章:
- QTableView:endMoveRows在模型中重置水平页眉大小
- 将IBM Rhapsody模型集成到VS 2019中
- 旋转模型矩阵时的形状失真
- 落砂模拟碰撞检测C++和SFML
- 成员函数调用和C++对象模型
- 连接 dockerized 模型和 dockerized 数据库时出现"无法 SQLConnect"错误
- 打印 ONNXRUNTIME::图形没有模型
- SFML 碰撞永远不会在我的系统中注册
- C++内存模型和位字段的最大序列
- 使用SIR模型的疾病爆发模拟
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 如何在 ECS 模型中组织实体?
- 在官方张量流 resnet50 模型上运行 tflite 精度工具
- Libtorch:如何加载ONNX模型?
- 使用 assimp 加载模型 - 不需要提升?
- 在均匀网格中处理碰撞
- 如何将经过训练的机器学习模型保存在python中并将其加载到C++中进行预测?
- 如何使用灵活的碰撞库在两个点云或点云与机器人末端执行器模型之间进行碰撞检测
- 如何访问Assimp模型数据以进行碰撞
- C++ 使用 Obj 模型的碰撞