Нестабильные столкновения в физическом проекте C++C++

Программы на C++. Форум разработчиков
Anonymous
Нестабильные столкновения в физическом проекте C++

Сообщение Anonymous »

Я пытаюсь создать небольшой физический движок на C++ с OpenGL. И я добавил класс твердого тела. И я могу определить, когда происходят столкновения. Но когда я пытаюсь добавить коллизии в графическую часть движка, они кажутся очень нестабильными. Твердое тело опускается, а затем внезапно поднимается обратно, когда оно сталкивается с коробкойRigidbody. Rigidbody также врезается в boxRigidbody. Как я могу это решить? Даже если реституция установлена ​​на ноль, она все равно нестабильна
if (CollisionDetector::detectCollisions(boxRigidbody, rigidbody)) {
glm::vec3 collisionNormal = glm::normalize(rigidbody.getPosition() - boxRigidbody.getPosition());

glm::vec3 relativeVelocity = rigidbody.getVelocity() - boxRigidbody.getVelocity();

float relativeVelocityAlongNormal = glm::dot(relativeVelocity, collisionNormal);

if (relativeVelocityAlongNormal > 0) {
return 0;
}

float restitution = 0.8f;

float j = -(1 + restitution) * relativeVelocityAlongNormal;
j /= 1 / rigidbody.getMass() + 1 / boxRigidbody.getMass();

glm::vec3 impulse = j * collisionNormal;
rigidbody.setVelocity(rigidbody.getVelocity() + impulse / rigidbody.getMass());

const float separationThreshold = 0.1f; // Adjust as needed
glm::vec3 separation = separationThreshold * collisionNormal;
rigidbody.setPosition(rigidbody.getPosition() + separation);

boxRigidbody.setPosition(boxRigidbody.getPosition() - separation);
}

Если вам интересно, вот класс твердого тела:
class Rigidbody {
private:
glm::vec3 position;
glm::vec3 velocity;
glm::vec3 acceleration;
glm::vec3 force;
float mass;
glm::vec3 gravity;

// Bounding box dimensions
glm::vec3 boundingBoxMin;
glm::vec3 boundingBoxMax;

public:
Rigidbody(glm::vec3 initialPosition, float initialMass, glm::vec3 initialGravity,
glm::vec3 minBoundingBox, glm::vec3 maxBoundingBox)
: position(initialPosition), mass(initialMass), velocity(glm::vec3(0.0f)), acceleration(glm::vec3(0.0f)),
force(glm::vec3(0.0f)), gravity(initialGravity), boundingBoxMin(minBoundingBox),
boundingBoxMax(maxBoundingBox) {}

void applyForce(glm::vec3 externalForce) {
force += externalForce;
}

void update(float deltaTime) {
// Apply gravity
force += mass * gravity;

// Apply Newton's second law: F = ma
acceleration = force / mass;

// Update velocity
velocity += acceleration * deltaTime;

// Update position
position += velocity * deltaTime;

// Reset force for next update
force = glm::vec3(0.0f);
}

glm::vec3 getPosition() const {
return position;
}

glm::vec3 getVelocity() const {
return velocity;
}

void setPosition(glm::vec3 newPosition) {
position = newPosition;
}

void setVelocity(glm::vec3 newVelocity) {
velocity = newVelocity;
}

float getMass() const {
return mass;
}

void setMass(float newMass) {
mass = newMass;
}

glm::vec3 getGravity() const {
return gravity;
}

void setGravity(glm::vec3 newGravity) {
gravity = newGravity;
}

// Methods to get the bounding box dimensions
glm::vec3 getBoundingBoxMin() const {
return boundingBoxMin;
}

glm::vec3 getBoundingBoxMax() const {
return boundingBoxMax;
}

// Bounding box collision detection
bool checkCollision(const Rigidbody& other) const {
// Get the bounding box of the other Rigidbody
glm::vec3 minB = other.getPosition() + other.getBoundingBoxMin();
glm::vec3 maxB = other.getPosition() + other.getBoundingBoxMax();

// Check if this bounding box intersects with the other bounding box
return (position.x + boundingBoxMax.x >= minB.x &&
position.x + boundingBoxMin.x = minB.y &&
position.y + boundingBoxMin.y = minB.z &&
position.z + boundingBoxMin.z

Подробнее здесь: https://stackoverflow.com/questions/784 ... cs-project

Вернуться в «C++»