Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

гравитация и её последствия [Delphi, Windows]


Страницы:   1 2 3 4 5 6 7 8

TButton ©   (2006-05-26 17:57:00) 

свершилось! =)
я собрал мысли в кучу и вдохновлённый передачей про зарождение солнечной системы в целом и земли в частности
написал систему взаимогравитирующих частиц
прикрутил это к движку на qPixels
(2Д, говорите, не модно)
и получилось собственно вот это

http://slil.ru/22783716

очень долго мучался с настройкой мировых констант
но вроде бы что-то получилось


tButton   (2006-08-16 18:53:00) [21]

счас положу
екзе
http://marcuch.ru/f/gravo.exe
сорц модуля с частицами
http://marcuch.ru/f/uPts.pas


Prohodil Mimo   (2006-08-15 17:57:00) [22]

tButton, выложи свою где-нибудь, ато все ссылки уже устарели. Или это я скачать не могу? Говорит что файл не найден.


tButton   (2006-06-12 07:22:00) [23]

вообще-то не подсматривал.


Ricks   (2006-06-11 19:39:00) [24]

Не иначе как у меня "подсмотрел"? Ну что же, я не против, собственно для этого и выкладывал, но хоть бы кто слово про мою программулину сказал...


tButton   (2006-06-10 16:04:00) [25]

решил (теоретически) проблему с масштабами, теперь для вещества в системе будет задаваться плотность, которая будет выступать коэффициентом в рассчёте масса->радиус


tButton   (2006-06-10 16:02:00) [26]

оптимизировал расчёт векторов
скорость повысилась в 2-2.5 раза
вместе с этим внезапно исчезли глюки с "гуляющим" импульсом =)
вместо него теперь переодически возникает глюк с улетающей "звездой"
звезда неизвестно откуда берёт начальную скорость и улетает за пределы облака частиц, оставляя за собой полосу чистого пространства =)


Ricks   (2006-06-09 17:56:00) [27]

Поделюсь своими достижениями:
http://www.ricks.pisem.net/space.zip

(исходники внутри)

специально сделал вывод центра масс и расчет импульса. Импульс сохраняется, центр масс почти не двигается, но вот большинство объектов либо падает на центральную звезду либо улетает... :(


tsa   (2006-06-09 11:57:00) [28]

Понравилось, забавно. Пожелание - когда меняешь параметры - массы например - начинается сначала расчёт, а хотелось увидеть как новые параметры "подействуют" на уже рассчитанное. Как игра - не дай разлететься и подобное.


tButton   (2006-06-09 05:50:00) [29]

сорц модуля описывающего систему частиц
http://slil.ru/22822987
код коллизии
procedure tPSys.Collide(p1, p2: integer);
var
 rp: tPrt;
 sm: real;
 m1, m2: real;
begin
 m1:=pts[p1].m;
 m2:=pts[p2].m;
  sm:=m1+m2;
 m1:=m1/sm;
 m2:=m2/sm;
 rp.x:=pts[p1].x*m1+pts[p2].x*m2;
 rp.y:=pts[p1].y*m1+pts[p2].y*m2;
  rp.vx:=pts[p1].vx*m1+pts[p2].vx*m2;
 rp.vy:=pts[p1].vy*m1+pts[p2].vy*m2;
 rp.m:=pts[p1].m+pts[p2].m;
 rp.r:=masstoradius(rp.m);
 pts[p1]:=rp;
 pts[p2].m:=0;
end;

свежий екзешник
http://slil.ru/22822989


Yokmombyk   (2006-06-08 23:05:00) [30]

Для суммарного нулевого импульса можно создавать мир с "анти"-телами: создаёшь частицу - создавай такую же, но с противоположно направленной скоростью.

Если у тебя где-то после стартовой инициализации есть рандомайз - импульс будет меняться :) Если рандома нет - модель кривая.

Хотя что это я, наверное чужие мысли в десятый раз повторяю. Просто ветку полностью не читал.


Думкин   (2006-06-08 05:41:00) [31]

Можешь кинуть в меня кодом. Посмотрю, может что и соображу.


tButton   (2006-06-08 05:14:00) [32]

давайте определимся уже
моя модель физическая
в ней упор на точное использование формул и максимальный реализм происходящего
модель Cash'а - визуальная
в ней всё быстро и очень похожене более, ибо слишком много приближений =)

теоретически нельзя всё свалить в одну кучу
рассчёт векторов
перемещение в соответствии с вычеслеными векторами
и коллизия
должны происходь последовательно и никак иначе
нельзя в одной итерации цикла посчитать векторы частицы, тут же её подвинуть и заодно проверить коллизию
это приведёт к тому, что последующие частицы будут рассчитываться относительно уже изменившейся модели мира.

к Думкину
посчитал вчера импульс системы... ужаснулся. импульс колеблется достигая очень больших значений (например может варьироваться от 800 до 6000 и обратно).
попробовал создать систему из 4х частиц
частицы болтаются
импульс ненулевой, но постоянный
после первой же коллизии начинается болтанка
не знаю почему, но грешу на код коллизии
sm:=p1.m+p2.m;
m1:=p1.m/sm;
m2:=p2.m/sm;
...
pr.vx:=p1.vx*m1+p2.vx*m2;
pr.vy:=p1.vy*m1+p2.vy*m2;

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


Ricks   (2006-06-07 19:56:00) [33]


> Эй! Не спирай все на меня! :)))


Попробуйте все-таки сделать эту самую скорость по другому, я думаю примерно так:

gravity возвращает силу, которая (как известно) равна m•a, таким образом a = F / m, а вашем случае v = g / pt.Mass
Попробуйте и скажите, изменилось ли что-нибдуь.....


Cash   (2006-06-07 16:41:00) [34]

> это код Cash'а =)

Эй! Не спирай все на меня! :)))
Это кста... твой код. Мой без Gravity и всякого такого, там чистая
компановка. И вааааще, я отсебятину не делал, я только твой код
облегчаю. :)

> * таки оптимизировать обсчёт
Обязательно дай позырить неоптимизированный и оптимизированный модули!


Ricks   (2006-06-07 11:28:00) [35]


> tButton ©
...
> это код Cash'а =)
> я сам его до сих пор не понимаю =)
>     vx:=dx/d;
>     vy:=dy/d;
> это считаются проекции вектора скорости на оси OX и OY
>     vx:=vx*v;
>     vy:=vy*v
> а это перемножение проекций векторов на скалярное значение
> скорости
> т.е. умножаем единичный вектор на скаляр и получаем действительный
> вектор скорости


с этим как раз все в порядке, это одно и то же, что модуль скорости умножить на cos и sin угла.

А все-таки, хотелось бы услышать объяснение (Cash'а или кого-нубудь другого) насчет получения этой самой скорости (вернее, наверно ускорения)

Кстати, если вредно, оказывается, канал "Культура" по ночам смотреть
, то Discovery Science вообще ни в коем случае нельзя смотреть :)
Потом ТАКОЕ захочется сделать... :)


tButton   (2006-06-07 07:16:00) [36]


> По каналу "Культура" дня четыре назад показывали, как Луна
> появилась, столкнулись две планеты, и компьютерная модель
> была показана, забавно :), столкнулись под острым уголм,
>  градусов 30 или 45, не помню уже, примерно половина или
> треть второй планеты раздробилась в космос, а ядро отскочив,
>  огибая Землю упала на неё, из обломков на орбите Луна собралась.
>  Вот упрощённо, так сказать, рассказал :).

кстати вот эта самая передача меня и сподвигла =)
вредно, оказывается, канал "Культура" по ночам смотреть =)


tButton   (2006-06-07 07:11:00) [37]

значит всё-таки K = mv, тогда проблем нет
просто тяжеловато советскую научную литературу интерпретировать
одна система СГС (кому она нафиг нужна?) чего стоит

Отчёт о проделаной работе:
* пока сделал сохранение/загрузку пресетов (начальных условий генерации)
* добавил в условия генерации нальную угловую скорость с вариациями
* добавив "рейтинг" 10 наиболее массивных частиц
* пофиксил счётчик итераций
* убрал нафиг fps. вместо него теперь выводится время обсчёта "тика" и время отрисовки кадра

Планы на сегодня:
* ввести компенсацию импульса системы
* добавить отображение массы, скорости и импульса для выбраной частицы
* добавить графическое отображение вектора скорости частицы

Планы на ближайшее будущее:
* таки оптимизировать обсчёт
* рассувать информацию по закладкам, ибо места на форме начинает нехватать =)


Думкин   (2006-06-07 06:46:00) [38]

> tButton ©   (06.06.06 16:20) [103]

Импульс частицы - вектор, получающийся в произведении вектора скорости на скаляр массы.
Импульс ситемы - сумма импульсов частиц его сотавляющих.
Для каждой частицы вектор скорости известен? Масса известна? Вектора складывать умеем? Так в чем заминка племяш?


tButton   (2006-06-07 04:18:00) [39]


> function TPhysSystem.Gravity(p1, p2: TPhysPoint): real;
> begin
>  result:=p1.Mass*p2.Mass/Dist(p1,p2)*FDelta;
> end;
>
> ...........
>      dx:=qt.x-pt.x;
>      dy:=qt.y-pt.y;
>      g:=Gravity(pt^,qt^);
>      v:=sqrt(2*g/pt.Mass);
>      d:=Dist(pt^,qt^);
>      vx:=dx/d;
>      vy:=dy/d;
>      vx:=vx*v;
>      vy:=vy*v;
>      pt.vx:=pt.vx+vx*FTicks;
>      pt.vy:=pt.vy+vy*FTicks;
> ..........

это код Cash'а =)
я сам его до сих пор не понимаю =)
    vx:=dx/d;
    vy:=dy/d;

это считаются проекции вектора скорости на оси OX и OY
    vx:=vx*v;
    vy:=vy*v

а это перемножение проекций векторов на скалярное значение скорости
т.е. умножаем единичный вектор на скаляр и получаем действительный вектор скорости

> И еще? Каким образом подбирали гравитационную постоянную?
>
> G (не учитывая порядок) = 6.672 [Н * м^2 / кг^2]
честно говоря я подбирал на глазок =)
потому что литературы под рукой небыло
опытным путём было установленно, что оптимальное значение для этой модели - 1/6000000

ПыСы
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1149522690&n=3
очень в тему =)


Ricks   (2006-06-07 01:55:00) [40]

Делал свою такую же фигню, но по другому - толком ничего не выходило, решил скачать модуль, посмотреть, как же у TButton ©и Cashтак все выходит хорошо.
Вот кусочек кода, которого я совсем не понял (правда, может я чего-то гоню):


function TPhysSystem.Gravity(p1, p2: TPhysPoint): real;
begin
 result:=p1.Mass*p2.Mass/Dist(p1,p2)*FDelta;
end;

...........
     dx:=qt.x-pt.x;
     dy:=qt.y-pt.y;
     g:=Gravity(pt^,qt^);
     v:=sqrt(2*g/pt.Mass);
     d:=Dist(pt^,qt^);
     vx:=dx/d;
     vy:=dy/d;
     vx:=vx*v;
     vy:=vy*v;
     pt.vx:=pt.vx+vx*FTicks;
     pt.vy:=pt.vy+vy*FTicks;
..........


Мы сначала находим СИЛУ, размерность которой равна [кг*м/с^2] а потом скорость находим из выражения КИНЕТИЧЕСКОЙ энергии, с размерностью [кг*м^2/с^2], таким образом у нас под корнем получается размерность ускорения:
(кг*м/с^2) / кг = м/с^2

Но ведь это под корнем, а что тогда получаем в значении "v"??

м^(1/2) / c???

И еще? Каким образом подбирали гравитационную постоянную?
G (не учитывая порядок) = 6.672 [Н * м^2 / кг^2]


Страницы:   1 2 3 4 5 6 7 8

Наверх

Титульная страница Поиск, карта сайта Написать письмо