Моделирование частиц растика оставляет частицы вибрировать, а не оставаться неподвижнымC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Моделирование частиц растика оставляет частицы вибрировать, а не оставаться неподвижным

Сообщение Anonymous »

Я использую C ++ с raylib, чтобы сделать моделирование частиц с как можно большим количеством частиц в коробке. Мне удалось настроить физику, которой я доволен, но у меня есть проблема, когда частицы готовы подпрыгивать и ударить на землю: они должны оставаться совершенно неподвижными, что происходит, но по какой -то причине они продолжают двигаться, отдавая вибрационный эффект. < /p>
Я пробовал многое, например, установление скорости на 0 под определенным порогом, увеличение демпфирования и многое другое. Я решил сохранить только эти 2 решения, так как они значительно улучшили его. < /P>
for (int i = 0; i < particles.size(); i++)
{
Particle& particle = particles;

// Apply gravity (acceleration)
if (particle.position.y < screenHeight - radius) {
particle.speed.y += gravity;
}

// Update position based on speed
particle.position.x += particle.speed.x;
particle.position.y += particle.speed.y;

// Apply air resistance (damping) with stronger damping when the particle is near zero speed
if (fabs(particle.speed.x) < VELOCITY_THRESHOLD && fabs(particle.speed.y) < VELOCITY_THRESHOLD) {
particle.speed.x *= 0.99f;
particle.speed.y *= 0.99f;
} else {
particle.speed.x *= damping_factor;
particle.speed.y *= damping_factor;
}

// Stop very small velocities
if (fabs(particle.speed.x) < VELOCITY_THRESHOLD) {
particle.speed.x = 0.0f;
}
if (fabs(particle.speed.y) < VELOCITY_THRESHOLD) {
particle.speed.y = 0.0f;
}

// Prevent the particle from going below the screen height (stop at the bottom)
if (particle.position.y >= screenHeight - radius) {
particle.position.y = screenHeight - radius;
particle.speed.y = 0.0f;
}

// Wall Bouncing
if (particle.position.x < 0 || particle.position.x > screenWidth)
{
particle.speed.x = -particle.speed.x;
if (particle.position.x < 0) particle.position.x = 0;
if (particle.position.x > screenWidth) particle.position.x = screenWidth;
}

if (particle.position.y < 0 || particle.position.y > screenHeight)
{
particle.speed.y = -particle.speed.y;
if (particle.position.y < 0) particle.position.y = 0;
if (particle.position.y > screenHeight) particle.position.y = screenHeight;
}

// Collisions
for (int j = 0; j < particles.size(); j++)
{
if (i != j)
{
float dist = Vector2Distance(particles.position, particles[j].position);

if (dist
Вот функция решающих столкновений: < /p>
// Function to resolve collisions between two particles
void solve_collision(Particle& p1, Particle& p2, float radius)
{
Vector2 diff = Vector2Subtract(p2.position, p1.position);
float dist = Vector2Length(diff);

// Ensure there's an actual collision
if (dist

Подробнее здесь: https://stackoverflow.com/questions/794 ... ying-still
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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