![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
гравитация и её последствия [Delphi, Windows]
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]