Я использую 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++
Программы на C++. Форум разработчиков
1738676065
Anonymous
Я использую C ++ с raylib, чтобы сделать моделирование частиц с как можно большим количеством частиц в коробке. Мне удалось настроить физику, которой я доволен, но у меня есть проблема, когда частицы готовы подпрыгивать и ударить на землю: они должны оставаться совершенно неподвижными, что происходит, но по какой -то причине они продолжают двигаться, отдавая вибрационный эффект. < /p>
Я пробовал многое, например, установление скорости на 0 под определенным порогом, увеличение демпфирования и многое другое. Я решил сохранить только эти 2 решения, так как они значительно улучшили его. < /P>
for (int i = 0; i < particles.size(); i++)
{
Particle& particle = particles[i];
// 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[i].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
Подробнее здесь: [url]https://stackoverflow.com/questions/79411849/raylib-particle-simulation-leaves-particles-vibrating-instead-of-staying-still[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия