Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];

Вниз

гравитация и её последствия   Найти похожие ветки 

 
TButton ©   (2006-05-26 17:57) [0]

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

http://slil.ru/22783716

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


 
TButton ©   (2006-05-26 18:00) [1]

пысы
основная потеря фпс происходит за счёт сложных рассчётов взаимодействия частиц
тормоза = кол-во_частиц^2 * кол-во_операций_с_одной_частицей / тактовая_частота_процессора


 
XProger ©   (2006-05-26 18:43) [2]

TButton, дай исходник этого "взаимодействия" - ускорим... ;)


 
Rial ©   (2006-05-26 18:57) [3]

Кошмар, FPS=2 !
Что же там такое творится?


> XProger ©   (26.05.06 18:43) [2]
>
> TButton, дай исходник этого "взаимодействия" - ускорим..
> . ;)

Поддерживаю.


 
RzCoDer ©   (2006-05-26 19:56) [4]

хых, 3 фпс
Я так понимаю, что для каждой частици по отношению к каждой был просто применён закон всемирного тяготения и это всё без какой либо оптимизации? Мугага


 
TButton ©   (2006-05-26 20:42) [5]

re [2], [3]
легко
http://slil.ru/22784148
только там мало комментариев, но там настолько сыро, что всё и так понятно)

re[4]
почему никакой? частица не взаимодействует сама с собой, только с другими частицами.
в оптимизации нуждается коллизия частиц, вот там да. там лес густой) просто я ещё не совсем определился как лучше это оптимизировать)


 
TButton ©   (2006-05-26 20:43) [6]

кмтати уже на 600 сотнящ частиц фпс поднимается до 10-11, а после 400 - все 30 положеных


 
XProger ©   (2006-05-26 23:02) [7]


function tPSys.DistQ(var p1, p2: tPrt): Single;
begin
 Result := sqr(p1.x - p2.x) + sqr(p1.y - p2.y);
end;

procedure tPSys.doCollision;
var
 i, j  : integer;
 pb    : array of tPrt;
 sr, d : Single;
 count : Integer;
begin
 for i := 0 to HIGH(pts) do
   if pts[i].m <> 0 then
     for j := 0 to HIGH(pts) do
       if i <> j then
    begin
         sr := sqr((pts[i].r + pts[j].r)/320);
         d  := DistQ(pts[i], pts[j]);
         if d <= sr then
           Collide(i, j);
       end;
 // &#247;&#232;&#241;&#242;&#232;&#236; &#237;&#243;&#235;&#229;&#226;&#251;&#229; &#247;&#224;&#241;&#242;&#232;&#246;&#251;
 count := 0;
 for i := 0 to HIGH(pts) do
   if pts[i].m <> 0 then
     inc(count);
 SetLength(pb, count);
 count := 0;
 for i := 0 to HIGH(pts) do
   if pts[i].m <> 0 then
   begin
  pb[count] := pts[i];
  inc(count);
   end;
 pts := pb;
end;

ТУРБААААА!!! ;)


 
Soughai   (2006-05-26 23:38) [8]

Ух ты млин =)
оптимизировать и оптимизировать =))


 
XProger ©   (2006-05-26 23:39) [9]

Кстати,
function tPSys.Gravity(p1, p2: tPrt): real;
begin
 result:=p1.m*p2.m/Dist(p1,p2)*gamma;
end;
Это не сила. Ибо не "обратнопропорционально квадрату расстояния"


 
TButton ©   (2006-05-27 09:42) [10]


> Это не сила. Ибо не "обратнопропорционально квадрату расстояния"

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


 
Soughai   (2006-05-27 15:22) [11]

вещь красивая кстати =), можно часами наблюдать...


 
Soughai   (2006-05-27 15:36) [12]

Напрягает, что вся система постоянно уходит куда-то врпаво вниз =(
нада скроллинг космоса замутить =)


 
Cash ©   (2006-05-27 16:12) [13]

TButton:
А как этим модулем пользоваться???
Тыб форму свою тоже кинул, а то как то мало понятно что к чему...


 
TButton ©   (2006-05-27 21:44) [14]


> вещь красивая кстати =), можно часами наблюдать...

сам прусь =)


> Напрягает, что вся система постоянно уходит куда-то врпаво
> вниз =(
> нада скроллинг космоса замутить =)

это я пофиксил вскоре после того как екзешку залил
сейчас камера центрируется относительно "звезды"
правда иногда подглюкивает
прикручу к проге интерфейс для настройки "мировых констант" и начальных параметров - выложу.


> TButton:
> А как этим модулем пользоваться???
> Тыб форму свою тоже кинул, а то как то мало понятно что
> к чему...

а очень просто. прописываешь модуль uPts в uses формы
создаёшь объект типа tPSys (как глобальную переменную или переменную формы).

инициальзация
sys.Init(<кол-во частиц>, <минимальная масса>, <максимум случайной прибавки к массе>, <радиус системы>);

потом тикаешь (по таймеру или я не знаю как)
sys.Tic(<промежуток времени для которого делается рассчёт>);

чтобы получить данные по частице проще всего - завести переменную типа tPrt и присваивать ей конкретную частицу из системы
p:=sys.pts[n];

что может понадобиться для визуализации
p.m - масса частицы (не знаю как её визуализировать)
p.r - радиус частицы (вычисляется автоматически, как радиус сферы с объёмом равным массе частицы)
p.x, p.y - пространственное положение

(примечание sys:tPSys)

как использую это всё я
* для отображения у меня битмап 640х640
* ТО(точка отсчёта) системы частиц у меня привязана к центру битмапа
т.е. 0:0 ситемы = 320:320 битмапа
* систему я инициализирую с радиусом 1, а визуализирую с радиусом 300 (поэтому в модуле при определении расстояния между частицами сумма радиусов делится на 300. это приведение к единой системе)
* отрисовкой занимается обрубок моего пиксельного движка на базе "быстрых пикселей" (tQuickPixels, можно скачать здесь в статьях)

ну вот так)
если что-то плохо объяснил или есть конкретные вопросы - спрашивай)


 
XProger ©   (2006-05-28 00:29) [15]

TButton, дык исправленный код коллизий дал прирост в скорости? ;)


 
Soughai   (2006-05-29 09:31) [16]

И это... Очень хочется следующую версию =)


 
Cash ©   (2006-05-29 10:20) [17]

TButton ©   (27.05.06 21:44) [14]:
Знаешь, TButton, я очень люблю танки! Особенно Т34, так люблю, что
поставил туда свой комп! Короче говоря в танке я сейчас и сижу! :)))

Собрал я форму, догадался как массу визуализировать, сделал систему,
а потом пронаблюдал как они все из центра разлетелись. :(
Непонял я как с ними кружиться. Они у меня только разлетаются.
Подскажи Plz, а я покажу, чего это такого я с ней сделал. В 2D через D3D!

Параметры взял с потолка: :)
Init:
n:   100;
m1: 10;
m2: 90;
r:    1;

doTic:
t: 1;

Вот так...

Тикает со скоростью 10..200 раз в сек. 50 по умолчанию.


 
Cash ©   (2006-05-29 11:39) [18]

Ладно, с вращением разобрались. Вот только всетаки уезжает она.
Центр системы уезжает всегда по разному. Но тем не менее, сейчас
запакую и положу на просмотр.


 
Cash ©   (2006-05-29 11:59) [19]

Вон, лежит, можно брать.
http://webfile.ru/967951

100 объектов, мало но работает хорошо.


 
TButton ©   (2006-05-29 12:56) [20]

2 Cash
про уезжание системы
не смотря на то, что все законы физики соблюдается
и сумарная кинетическая энергия системы всегда равна нулю
система склонна расшатывать сама себя
поэтому центр масс описывает замысловатые фигуры вокруг нулевой точки
об этом уже писал Soughai  в 12м посте
проблему эту я пофиксил следующим образом

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

2 XProger
сейчас проверю. а ты сравнительные тесты не проводил?

2 Soughai
скоро. возможно сегодня.


 
TButton ©   (2006-05-29 15:36) [21]

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


 
XProger ©   (2006-05-29 15:44) [22]

TButton, присвой указатели забудь про компилятор ;)


 
Cash ©   (2006-05-29 16:05) [23]

Я тут поколдовал трохи. Бубен хороший взял, потряс над модулем перед
костром предков, и... в общем там:
http://webfile.ru/968300 - бинарник
http://webfile.ru/968315 - сам модуль с пояснениями внутри.

:)))
Частицы..., аж самому понравились! :)))


 
TButton ©   (2006-05-29 17:10) [24]

http://slil.ru/22791706
обнова интерхвейса
всё что есть внутри задаётся снаружи
(Дискретизация в микросекундах)


 
Cash ©   (2006-05-29 17:24) [25]

Где то через 2 минуты наступает абскурация мира. Этакий судный день! :)))
И в результате из 1000 звезд остается только 110-120. Зрелище красивое,
еще бы к этому анимацию прикрутить, это было бы красиво. :)


 
Soughai   (2006-05-29 19:38) [26]

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


 
Cash ©   (2006-05-29 20:18) [27]

TButton ©   (29.05.06 17:10) [24]:
Нада UI с красивой отдачей? Сделал, на мой взгляд, давольно красиво.
Бинарник без D3DX81ab.dll лежит по адресу: http://webfile.ru/968713
сама библиотека на: http://webfile.ru/968725
а исходник (нужен Omega 93 GDK пакет) там: http://webfile.ru/968716
Система построена на моем классе с твоей начинкой (я даже код не
менял) :).


 
TButton ©   (2006-05-30 00:34) [28]


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

так кто ж тебе не даёт эксперементироватьс настройками)


> Я тут поколдовал трохи. Бубен хороший взял, потряс над модулем
> перед
> костром предков, и... в общем там:
> http://webfile.ru/968300 - бинарник
> http://webfile.ru/968315 - сам модуль с пояснениями внутри.
>
>
> :)))
> Частицы..., аж самому понравились! :)))

пытался скачать - не удалось
в предыдущем релизе всё равботает, только что-то у тебя с коллизией не так

кстати,
2 XProger
тестировал коллизию...
понял что в принципе, она сильно на скорость не влияет
на скорость сильно влияет CalcVectors
вот это вот и надо оптимизировать больше всего

думаю, что же там можно сделать.


 
TButton ©   (2006-05-30 00:48) [29]

к следующему релизу:
* сохранение/загрузка пресетов для инициализации
* сохранение/загрузка состояния системы частиц
* более детальная информация по выделеной частице
* panning вселенной (возможно)
* выделение частицы кликом (возможно)


 
Cash ©   (2006-05-30 06:38) [30]

TButton ©   (30.05.06 00:34) [28]:
> в предыдущем релизе всё равботает, только что-то у тебя
> с коллизией не так


Да, я это профиксил уже, в [27] лежит нормальная вещь! Ты ее скачай,
закачаешься! :))) Я там добавил splash небольшой при коллизии одной
звезды с другой. Кстати, массу я визуализировать придумал с помощью
цвета, звезды раскрашены от желтого через зеленый к aqua цвету.
Мне так покрайней мере понравилось.


 
TButton ©   (2006-05-30 09:45) [31]

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


 
Cash ©   (2006-05-30 14:52) [32]

Тормознее??? А у меня быстрее было. Ну да и эту вещь я тоже правил.
Сегодня в универ сносил, там компы древние. Новенькая прожка, которую
утром сбилдил, дала в универе на 128~250 звездах 6 кадров всекунду.
А там система, 800MHz/S3 8Mb Video/128 Mb RAM. Такой FPS меня удивил
даже.

Я все операции в один цикл загнал, стало работать быстрее. А тормоза
могут проявляться и от прорисовки. Там 6 точек на звезду, и каждая точка
предворительно подготавливается. На твоем пиксельном двиге это будет
быстрее.

А чего такого с центральной звездой? И в чем тормознутость сплэшей?
(сразу скажу, сплэш за звездой не идет, он возникает в месте
соприкосновения двух звезд)


 
Cash ©   (2006-06-01 19:52) [33]

Вон, если еще кому интересно, поправил маленько код (блин сессия скоро,
а мне делать нечего! :))) ), да и в общем поставил его как скринсейвер,
только без фич с настройкой и пред-просмотром.
http://webfile.ru/973571 - бинарник, к нему D3DX81ab.dll нодо.
http://webfile.ru/973582 - модуль с правленным классом.

У меня эта вещь на 128 точках 400++ FPS дает, а на 360 - ~40 FPS.


 
Думкин ©   (2006-06-02 05:48) [34]

> TButton ©   (29.05.06 12:56) [20]
> 2 Cash
> про уезжание системы
> не смотря на то, что все законы физики соблюдается
> и сумарная кинетическая энергия системы всегда равна нулю
> система склонна расшатывать сама себя
> поэтому центр масс описывает замысловатые фигуры вокруг
> нулевой точки

? Возможно импульс имелся в виду? Расшатывать из-за погрешностей модели?


 
Думкин ©   (2006-06-02 05:50) [35]

А если ввести еще обработку соударений? И в ряде случаев, чтобы частицы слипались? Появятся планеты со спутниками?


 
Думкин ©   (2006-06-02 05:57) [36]

Хотя поглощение происходит. Будем посмотреть.


 
TButton ©   (2006-06-02 07:27) [37]


> ? Возможно импульс имелся в виду? Расшатывать из-за погрешностей
> модели?

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

погрешности модели допустимы лишь относительно визуализации
относительно физики могут присутствовать лишь погрешности законов физики =)
(возможность создания вечного двигателя доказана теоретически)


> А если ввести еще обработку соударений? И в ряде случаев,
>  чтобы частицы слипались? Появятся планеты со спутниками?

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

мысль о соударениях частиц без слипания безусловно интересна
т.е. столкновение с образованием осколков
но она требует введения физических характеристик частиц
(частицы газа и частицы твёрдого вещества при коллизии ведут себя по-разному)
а сие есть... введение дополнительных сложностей


 
Cash ©   (2006-06-02 07:29) [38]

Думкин ©   (02.06.06 05:48) [34]..[36]:
Товарищ, но ведь и галактики не стоят на месте, хоть их суммарная
кинетическая энергия равна 0. Равновесие энергии есть, но нет равновесия
по массе, всегда в каком либо краю суммарная масса будет больше или
меньше по сравнению с противоположным краем. Поэтому система и едет.
Просто притяжение одной половины галактики больше, а другой меньше и
область с большей гравитацией проходит меньший путь к центру системы
тем самым смещая его.

Спутники на планетах там тоже образуются. Когда планета набирает
достаточный вес и уходит достаточно далеко от центра системы, и при этом
к ней по приемлемой траектории приближается маленькая планета, масса
и скорость которой удовлетворяет условиям, то этот маленький метеор
заходит на орбиту планеты и становится луною. Зрелище неописуемо,
только в системе из [33] этого ждать придется около часа или поболее.
Система в кондицию должна прийти. :)


 
TButton ©   (2006-06-02 07:47) [39]


> этого ждать придется около часа или поболее.
> Система в кондицию должна прийти. :)

на начальных этапах можно выставить дискретизацию 50мкс
это позволит быстро пройти этап формирования протопланет
позже можно выставить дискретизацию ~5 (по умолчанию - 3.3) мкс
просто при больших промежутках между обсчётом может произойти банальное проскакивание одной частицы сквозь другую
в другой ситуации это решилось бы трассированием, но здесь это не приемлимо =)

ПыСы
возникла мысль, что на базе всего этого мог бы получиться неплохая Space Arcade. единственная проблема - визуализация, ведь даже самая маленькая планета несоизмеримо больше космического корабля =)


 
Cash ©   (2006-06-02 07:55) [40]


> ведь даже самая маленькая планета несоизмеримо больше космического
> корабля


А это кто сказал??? 8)
В Hegemonia только истребки и планетарные колонизаторы меньше планет,
орбитальные станции почти с пол планеты, а БШ, линкоры и т. д, они
соизмеримы вроде были.

Но сначала надо еще больше оптимизировать эту систему, чтобы у нее
трудоемикость не была квадратической. (в модуле из [33] она такая, а в
других - порядок больше)



Страницы: 1 2 3 4 вся ветка

Форум: "Игры";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.58 MB
Время: 0.047 c
2-1184090570
Евгений Р.
2007-07-10 22:02
2007.08.12
Перемещение по DrawGrid


2-1184862965
olevacho_
2007-07-19 20:36
2007.08.12
Как отобразить данные в DBGrid


9-1148651868
TButton
2006-05-26 17:57
2007.08.12
гравитация и её последствия


15-1184703140
Витян
2007-07-18 00:12
2007.08.12
Delphi 7 и Windows Vista


2-1184578180
vasIZmax
2007-07-16 13:29
2007.08.12
Включить/выключить прокси





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский