Физический движок

  1. Оффлайн

    MrKerbMan

    Хорошие люди

    Сообщений: 5537

    Вот, держите горячий пирожок новый движок билд.
    Лякуша, если скачаешь, за информацией по делению времени на отрезки при проверке коллизии лезь в консоль.
    http://yadi.sk/d/Qho0za7UMpRGJ
    Подпись обновил.


    GLORY TO KOLOBKI!!!

    29 апреля 2014 - 22:25 / #201
  2. Оффлайн

    Fidel

    Хорошие люди

    Сообщений: 3628

    а можно просто видио с его применением?)
    29 апреля 2014 - 22:34 / #202
  3. Оффлайн

    MrKerbMan

    Хорошие люди

    Сообщений: 5537

    а можно просто видио с его применением?)

    Трояна боишься?
    Могу, но не сразу.


    GLORY TO KOLOBKI!!!

    29 апреля 2014 - 22:37 / #203
  4. Оффлайн

    MrKerbMan

    Хорошие люди

    Сообщений: 5537



    GLORY TO KOLOBKI!!!

    29 апреля 2014 - 23:31 / #204
  5. Оффлайн

    MrKerbMan

    Хорошие люди

    Сообщений: 5537

    Пока есть время, напишу логику движка.
    Во первых, всё строится на двух классах (Базовых объектах, если по-русски): класс тела и класс мира. Первый класс довольно прост: он содержит в себе значение позиции, скорости, силы, действующей на него в это мгновение. Также он содержит методы (Причастия действия, которые выполняет объект, или выполняются над ним. При этом эти действия заложены в самом объекте. Пример: при нажатии на игрушку-пищалку "вызывается" её "метод" "пищания"), которые выполняют базовые операции над вышеперечисленными величинами (Найти радиус из плотности и массы и т.д.). Сразу хочу сказать, что в САМОМ движке графической части НЕТУ, все картинки выводятся на экран доп. кодом. Это сделано для того, чтоб заинтересовавшимся людям (Или мне ) было легче копипастить движок в другие программы, не таща с собой графические библиотеки. Ладно, про физ. объект рассказал (Собственно, если вы не поняли сами, они нужны как прослойка между интерфейсом и движком).
    Теперь перейдём к самой сложной части, к тому, что все расчёты и делает. Класс мира! Вся и всё физики моего движка. В нём хранятся процедуры ньтоновской гравитации, коллизии, перемещения тел и прочие вкусняшки. Я думаю, всё кроме коллизии (Столкновений) понятно и я не буду останавливаться на них. Расскажу поподробнее о коллизии. Хотя, что тут рассказывать, всё до меня ещё сделали:

    MrKerbMan, Объекты круглые? Тогда при просчете следующего положения создавать виртуальный прямоугольник длиной равной перемещению объекта и шириной, равной диаметру круга. Собственно, нужен не сам прямоугольник, а координаты его вершин. Зная размер и положение объекта, направление и величину его скорости, можно без труда найти эти координаты. Так вот, в конце каждого кадра проверять на пересечения эти прямоугольники(я точно не помню алгоритм, поищи сам, но он весьма элементарен, особенно для 2д и не ест много ресурсов). Нет пересечения - все спокойно, можно давать следующий кадр. Есть - возможны пересечения и тут нужно рассматривать отдельно эти объекты на предмет столкновения. Для этого разбить виртуально кадр на гораздо меньшие куски времени и на каждом куске мерять расстояние между центрами двух объектов. Как только это расстояние меньше либо равно сумме диаметров объектов - поздравляю, имеем столкновение, причем известно точное его время и положения объектов - считай не хочу новые траектории. Более того, учитывая линейность движений внутри кадра, как только расстояние начнет увеличиваться, дальше можно не считать, ибо столкновения не будет. Недостатком модели есть то, что один объект за один кадр не сможет столкнуться больше чем один раз. Достоинство - с прямыми руками кодера, даже калькулятор потянет расчет.


    Складываем модули скоростей. Как вариант, складываем по модулю проекции скоростей на оси отдельно и выбираем сумму по той оси, которая будет больше. А еще можно из большей по модулю скорости вычесть(векторно) меньшую скорость и взять модуль результата... и еще есть с десяток вариантов, чеснослово, не знаю, что подойдет лучше по соотношению сложность/точность. В любом случае, всегда лучше брать немного больше, чем немного меньше.

    Далее суммируем радиусы объектов и полученное значение делим на вышерассчитанную теоретически максимальную скорость сближения. Полученное число и есть оптимальный отрезок времени, который гарантирует, что момент столкновения не будет проморган. Как вариант взять 0,9, 0,8 или даже 0,5 от этого значения, чтобы наверняка.


    Всё сделано АБСОЛЮТНО так, как написал Лякуша.
    Ну, думаю самое "интересное" объяснил.
    Код движка потом залью.


    GLORY TO KOLOBKI!!!

    30 апреля 2014 - 16:06 / #205
  6. Оффлайн

    Лякуша Уляпик

    Модераторы

    Сообщений: 6471

    MrKerbMan писал:
    Всё сделано АБСОЛЮТНО так, как написал Лякуша.


    А вот это зря. Я ж профан в этом деле.

    Не люблю людей... ну или не умею толком их готовить.

    30 апреля 2014 - 16:15 / #206
  7. Оффлайн

    MrKerbMan

    Хорошие люди

    Сообщений: 5537

    А вот это зря. Я ж профан в этом деле.



    GLORY TO KOLOBKI!!!

    30 апреля 2014 - 16:34 / #207
  8. Оффлайн

    Fidel

    Хорошие люди

    Сообщений: 3628

    MrKerbMan писал:
    Трояна боишься?
    лень качать
    30 апреля 2014 - 17:54 / #208
  9. Оффлайн

    MrKerbMan

    Хорошие люди

    Сообщений: 5537

    Введём обозначения для смещения центра окружности за интервал времени (1). Тогда координаты центра в любой момент времени внутри интервала можно вычислить по формуле (2).
    В момент соприкосновения расстояние между центрами окружностей равняется сумме их радиусов. Отсюда получаем формулу (3). Подставляем (2) в (3) и получаем (4). Перегруппируем элементы формулы, получим (5). Введём новые обозначения (6) и (7). С их учётом перепишем формулу в виде (8). Раскрыв её левую часть и приведя многочлен в нормальную запись получим квадратное уравнение (9) относительно t.
    Найдём его дискриминант.
    Если он меньше 0, то окружности не сталкиваются.
    Если он равен 0 и значение t лежит в интервале [0,1], то окружности заденут друг друга, но разойдутся.
    Если он больше 0, то найдём значения t, попадающие в интервал [0,1]. Если таких нет, то столкновения в данный интервал времени не будет. Если их два, то возьмём меньшее из них. Полученная величина t будет моментом столкновения. Точные координаты центров в этот момент можно найти подставив t в формулы (2).

    Мне надо не только найти столкновение, но и адекватно передвинуть тело (Прикинь, если на пол пути тело увеличит массу вдвое, а направление скорости кардинально поменяет. Будет обидно, если тело с новой массой и скоростью полетит из начальной точки. Да и вообще, может оно сразу с 5 телами столкнётся?) Не, чувак, сорри, мне так не надо. Пока и так норм (Даже не норм, а круто), всё робит быстро и точно.


    GLORY TO KOLOBKI!!!

    30 апреля 2014 - 19:49 / #209
  10. Оффлайн

    ThePhobius

    Посетители

    Сообщений: 469

    Пусть у нас есть две окружности, a и b, центры которых одновременно равномерно и прямолинейно двигаются

    Не подходит.
    30 апреля 2014 - 20:10 / #210
  11. Оффлайн

    Rsa

    Посетители

    Сообщений: 649

    MrKerbMan писал:
    Мне надо не только найти столкновение, но и адекватно передвинуть тело

    Тоже не проблема, составить список пар столкновений в текущем кванте времени, пока список не пустой найти самое раннее столкновение, обработать его, исключить пары, содержащие столкнувшиеся тела, добавить столкновения нового тела.
    MrKerbMan писал:
    Не, чувак, сорри, мне так не надо.

    Ну дело хозяйское, было бы предложено.
    30 апреля 2014 - 20:20 / #211
  12. Оффлайн

    MrKerbMan

    Хорошие люди

    Сообщений: 5537

    Ага, спасибо. Математика, конечно, вещЪ, но я сомневаюсь, что по твоему быстрее будет. У меня фактически просто несколько раз к позиции скорость прибавляет, и усё.
    Тоже не проблема, составить список пар столкновений в текущем кванте времени, пока список не пустой найти самое раннее столкновение, обработать его, исключить пары, содержащие столкнувшиеся тела, добавить столкновения нового тела.

    Не понял, как это связано с адекватным перемещением. Уж прости дурака...
    Не подходит.

    Вот - вот, параболы минимум!


    GLORY TO KOLOBKI!!!

    30 апреля 2014 - 21:32 / #212
  13. Оффлайн

    ux3sty

    Посетители

    Сообщений: 365

    MrKerbMan, Подходит!
    Ведь алгоритм идет дискретно, обсчитывая сначала скорости, а потом передвигая тело на скорость*время, и движение в этот момент прямолинейно.
    В конце концов промежуток маахонький, и можно считать его рооовненьким.
    Все же тебе не хватает знаний физики или скорее математики.

    3-х местный самолет "Коротыш"

    30 апреля 2014 - 21:40 / #213
  14. Оффлайн

    MrKerbMan

    Хорошие люди

    Сообщений: 5537

    А вот тут ты неправ! У меня действие силы расчитывается как можно одновременней с движением.
    Да, физики и математики мне не хватает, но я для того и делаю движок, чтоб вспомнить.


    GLORY TO KOLOBKI!!!

    30 апреля 2014 - 23:03 / #214
  15. Оффлайн

    MrKerbMan

    Хорошие люди

    Сообщений: 5537



    GLORY TO KOLOBKI!!!

    3 мая 2014 - 18:52 / #215
  16. Оффлайн

    Pol Kosmich

    Посетители

    Сообщений: 379

    MrKerbMan, Что за Космический SPORE творится на экране???
    З.Ы. Да, Ханс Циммер совсем скатился... Сначала Call of Duty, теперь вон к любительским видео музыку пишет...
    3 мая 2014 - 23:37 / #216
  17. Оффлайн

    MrKerbMan

    Хорошие люди

    Сообщений: 5537

    Polsha, мне тебе все 15 страниц пересказывать?


    GLORY TO KOLOBKI!!!

    4 мая 2014 - 10:34 / #217
  18. Оффлайн

    MrKerbMan

    Хорошие люди

    Сообщений: 5537

    Свершилось чудо! Я сделал динамическое количество интераций просчёта множества объектов! Теперь точность просчёта интераций будет возрастать с ускорением симуляции, а с замедлением, наоборот, падать, что позволит держать общую точность и производительность неизменной. Долой лаги при низкой скорости, а при высокой - глюки в просчётах!


    GLORY TO KOLOBKI!!!

    9 мая 2014 - 01:53 / #218
  19. Оффлайн

    MrKerbMan

    Хорошие люди

    Сообщений: 5537

    Так что там с температурой? Хочу запилить передачу тепла через свет от звезды (Массивный объект с картинкой звезды) к планете (Малый объект с картинкой планеты).

    Известно расстояние между ними, их радиус, масса и температура. В общем, надо халтурную формулу. У меня пока такая идея: пропорция (L/R1*t1) = (L/R2*t2).
    Сообщение отредактировал MrKerbMan 10 мая 2014 - 11:59


    GLORY TO KOLOBKI!!!

    10 мая 2014 - 11:12 / #219
  20. Оффлайн

    MrKerbMan

    Хорошие люди

    Сообщений: 5537

    Думаю, всё норм, помощи по температуре не надо.


    GLORY TO KOLOBKI!!!

    10 мая 2014 - 13:04 / #220

Статистика форума, пользователей онлайн: 0 (за последние 10 минут)

---

Администраторы | Модераторы | Хорошие люди | Посетители | Новичок

Создано тем1921 Всего сообщений158031 Пользователей19226 Новый участникUnknownMollusk
Последние сообщения с форума
  • Автор
    Тема в разделе: Новости
    Просмотров: 6
    Ответов: 0
  • Автор
    Тема в разделе: Вопросы по игре
    Просмотров: 1567113
    Ответов: 12701
  • Автор
    Тема в разделе: В ангаре у Боба
    Просмотров: 9565
    Ответов: 55
  • Автор
    Тема в разделе: Технические вопросы
    Просмотров: 25912
    Ответов: 68
    Все сообщения..
    Полный список последних сообщений
    Loading...

    Нашли ошибку?
    Вы можете сообщить об этом администрации.
    Выделив текст нажмите Ctrl+Alt