Я использую 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
Моделирование частиц растика оставляет частицы вибрировать, а не оставаться неподвижным ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Моделирование CUDA C++: позиции частиц MD становятся NaN во время моделирования MD/MPCD
Anonymous » » в форуме C++ - 0 Ответы
- 36 Просмотры
-
Последнее сообщение Anonymous
-