Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flasher.ru > Флейм

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 24.07.2009, 15:59
Герыч вне форума Посмотреть профиль Отправить личное сообщение для Герыч Найти все сообщения от Герыч
  № 1  
Ответить с цитированием
Герыч
 
Аватар для Герыч

блогер
Регистрация: Apr 2009
Адрес: НиНо
Сообщений: 185
Записей в блоге: 12
Attention Нестабильность в Spring System

Ибо на форуме нет раздела, посвящённого общим вопросам по программированию, а с флэшом это никак не связано, пишу сюда.

Я продолжаю работу над моделью воды.. Сейчас занимаюсь тем, что пытаюсь превратить воду в желе. Реализовал предложенный в этой статье метод.
В кратце о методе:
Есть много частиц, образующих жидкость. В каждый момент времени между соседними частицами(расстояние меньше радиуса h), если между ними нет связи, добавляется связь длины h. Потом для каждой связи её длина корректируется(сжимается, если частицы сближены и наооборот). Если длина связи оказалась>h она рвётся.
Вот примерно как это выглядит:

Код:
if(d(i,j)-L(i,j)>stretch_treshold*L(i,j))
  L(i,j)+=stretch_speed*(d(i,j)-L(i,j)-stretch_treshold*L(i,j))*dt;
else if(d(i,j)-L(i,j)<-treshold*L(i,j))
  L(i,j)+=compress_speed*(d(i,j)-L(i,j)+compress_treshold*L(i,j))*dt;
L(i,j) - длина связи
d(i,j) - расстояние от i-ой до j-ой точки
compress_treshold-пороговая величина, которая означает, во сколько раз надо сжать связь, чтобы она начала менять длину
stretch_treshold - аналогично для растяжения
compress_speed-скорость сжатия
stretch_speed - скорость растяжения
dt-временной интервал
Все эти связи действуют почти как пружинки. Вот формула силы, действующей на частицы:
Код:
power=k*(1-L(i,j)/h)*(L(i,j)-d(i,j))
k-сила связи

Разные материалы задаются разными константами. В статье написано, что можно даже клей сделать)
Всё работает на ура и быстро, но есть противный баг.
Я понимаю его так:
Представьте 2 частицы. Расстояние между ними близко к нулю, длина связи близка к h.
На частицы будет действовать достаточно большая сила, которая будет их отталкивать друг от друга. После применения сил к частицам они будут на расстоянии близком к h, длина же связи будет немного уменьшена на прошлом шаге(т.к. связь была сжата). Теперь связь растянута и она длина будет увеличена, но частицы будет притянуты обратно. Этот процесс будет продолжаться, пока не наконец изменение свзи не станет достаточно большим, чтобы порвать её. Но к этому моменту частицы наберут оч большую скорость.

Такие же проблемы могут возникать не только если делать симуляцию воды.. вообще любую связанную достаточно жёсткими пружинками систему частиц.

Вопрос ко всем, и особенно к тем, кто с этим сталкивался: знаете ли вы как это исправить?

Вот пример(200 частиц). Управление мышкой. Попробуйте немного подёргать это желе и увидите баг(капельки начнут сами вылетать, а вся конструкция поднимется к середине экрана)

Единственное решение, которое приходит мне в голову - уменьшить dt-но это значит и ускорение таймера(чтобы не было заторможенного движения) и больше вычислений - и тормоза...

Старый 24.07.2009, 16:59
bebop вне форума Посмотреть профиль Отправить личное сообщение для bebop Найти все сообщения от bebop
  № 2  
Ответить с цитированием
bebop
 
Аватар для bebop

Регистрация: Dec 2006
Адрес: Novosibirsk
Сообщений: 93
пара мыслей:

1) принудительно рвать связи на негодных частицах
2) ввести силы сопротивления, тогда лавинный эффект остановится

Старый 24.07.2009, 17:01
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 3  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
по-моему лучше отписать на форум по алгоритмике или на gamedev.ru - там больше специалистов в этом.

Updated:
уменьшить dt и считать систему несколько раз за таймер?

Старый 24.07.2009, 17:33
Герыч вне форума Посмотреть профиль Отправить личное сообщение для Герыч Найти все сообщения от Герыч
  № 4  
Ответить с цитированием
Герыч
 
Аватар для Герыч

блогер
Регистрация: Apr 2009
Адрес: НиНо
Сообщений: 185
Записей в блоге: 12
Проблемы последнего метода в конце моего первого поста. Сейчас экспериментирую с нелинейными сигмоидо-подобными функциями вместо этой
Код:
power=k*(1-L(i,j)/h)*(L(i,j)-d(i,j))

Старый 24.07.2009, 17:38
VVall вне форума Посмотреть профиль Отправить личное сообщение для VVall Найти все сообщения от VVall
  № 5  
Ответить с цитированием
VVall

Регистрация: Feb 2009
Сообщений: 1,195
А dt может в вашей реализации быть больше 1? Я в таких случаях делаю, что при dt>1 все расчёты выполняются с dt=1 нужное количество раз (округлённое dt) и потом ещё остаток. Тормоза, конечно, будут, но лучше тормоза без глюков, чем глюк без тормозов.


Последний раз редактировалось VVall; 24.07.2009 в 17:41.
Старый 24.07.2009, 17:52
Герыч вне форума Посмотреть профиль Отправить личное сообщение для Герыч Найти все сообщения от Герыч
  № 6  
Ответить с цитированием
Герыч
 
Аватар для Герыч

блогер
Регистрация: Apr 2009
Адрес: НиНо
Сообщений: 185
Записей в блоге: 12
dt=1
лучше без глюков без тормозов и я уверен, что можно найти быстрое решение... и найду)

Добавлено через 4 часа 46 минут
Странное существо-человек) Вот я: глядел демки grant kot'а, а именно эту
Как раз реализация того, что я хочу сделать, но на java. И у него похожий баг!!=)))) только его сложнее получить и он менее выражен из за высокого разрешения жидкости.

Старый 25.07.2009, 15:04
divinus вне форума Посмотреть профиль Отправить личное сообщение для divinus Найти все сообщения от divinus
  № 7  
Ответить с цитированием
divinus
 
Аватар для divinus

Регистрация: Dec 2005
Адрес: мухосранск
Сообщений: 661
Отправить сообщение для divinus с помощью ICQ
думается мне нужно просто поставить ограничение на максимальную скорость для всего и вся
__________________
Кто может делать - делает, кто не может делать - учит, кто не может учить - управляет...

Старый 25.07.2009, 16:07
Герыч вне форума Посмотреть профиль Отправить личное сообщение для Герыч Найти все сообщения от Герыч
  № 8  
Ответить с цитированием
Герыч
 
Аватар для Герыч

блогер
Регистрация: Apr 2009
Адрес: НиНо
Сообщений: 185
Записей в блоге: 12
оно уже давно есть. меньше ставить нельзя

Старый 25.07.2009, 16:56
aksios вне форума Посмотреть профиль Отправить личное сообщение для aksios Найти все сообщения от aksios
  № 9  
Ответить с цитированием
aksios
loading 50%
 
Аватар для aksios

Регистрация: Jun 2005
Адрес: I am where I should be
Сообщений: 3,567
Отправить сообщение для aksios с помощью ICQ
Морщить мозг не охота, но я так понимаю, проблема в возникновении "псевдо локального давления" большой величины. Для решения этой проблемы в статье использовано "раслабление" Dij. Увеличивайте расслабление системы при уменьшении дистанции между частицами.

Старый 25.07.2009, 18:24
Герыч вне форума Посмотреть профиль Отправить личное сообщение для Герыч Найти все сообщения от Герыч
  № 10  
Ответить с цитированием
Герыч
 
Аватар для Герыч

блогер
Регистрация: Apr 2009
Адрес: НиНо
Сообщений: 185
Записей в блоге: 12
Цитата:
псевдо локального давления
вот похоже именно оно и дестабилизирует всё это дело, а избавиться от бага наверно поможет внутреннее трение

Добавлено через 55 часов 59 минут
Да, решение найдено и оно банальное!
Для этого написал класс для отслеживания происходящего и экспорта в Excel. Момент "взрыва" занимал всего 4-6 тактов симуляции. В этот момент из-за суперсжатия желе на частицы начинало действовать сильнейшее давлние со стороны других частиц.
Я просто по-наглому сделал максимальную силу, которую могут оказывать частицы друг на друга и всё работает!!!
Вот демка

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:58.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
jello , Вода

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 01:58.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.