I am trying to make a small little physics engine in C++ with OpenGL. But the collisions are not working. I have a model importer with assimp with a mesh and a model class, And the mesh class spits out the ColliderVertices like this.
struct ColliderVertex {
glm::vec3 Position;
glm::vec3 Normal;
};
vector<ColliderVertex> colliderVertices;
void generateColliderVertices()
{
for (unsigned int i = 0; i < vertices.size(); i++)
{
ColliderVertex colliderVertex;
colliderVertex.Position = vertices[i].Position;
colliderVertex.Normal = vertices[i].Normal;
colliderVertices.push_back(colliderVertex);
}
}
And here’s the collision handler class:
class CollisionHandler {
public:
static bool checkCollision(const Rigidbody& rb1, const Rigidbody& rb2) {
const auto& vertices1 = rb1.getColliderVertices();
const auto& vertices2 = rb2.getColliderVertices();
// Perform collision detection logic
for (const auto& vertex1 : vertices1) {
for (const auto& vertex2 : vertices2) {
// Check for collision between each pair of vertices
if (isColliding(vertex1, vertex2)) {
// Collision detected
std::cout << "Collision detected!" << std::endl;
return true;
}
}
}
return false;
}
private:
static bool isColliding(const ColliderVertex& vertex1, const ColliderVertex& vertex2) {
float distance = glm::length(vertex1.Position - vertex2.Position);
float minDistance = 0.1f; //if i set this higher than 0.7 it detects every frame
return distance < minDistance;
}
};
And this is the main part of the rigidbody script:
std::vector<ColliderVertex> colliderVertices;
public:
Rigidbody(glm::vec3 position, float mass, const Model& model)
: position(position), mass(mass) {
const auto& meshes = model.meshes;
for (const auto& mesh : meshes) {
for (const auto& vertex : mesh.vertices) {
ColliderVertex colliderVertex;
colliderVertex.Position = vertex.Position;
colliderVertex.Normal = vertex.Normal;
colliderVertices.push_back(colliderVertex);
}
The collisions are not detecting properly. How can I fix this?