>Вычисляется персечение прямых, или всё-таки отрезков?
IntersectLines = пересечение прямых.
>почему true? если нет решения, значит и точки пересечения нет.
Потому что я привык возвращать false=ok, иначе код ошибки или просто true.
>А вообще интересует только факт пересечения отрезков без нахождения точки пересечения.
Это более сложная задача, чем пересечения прямых.
У меня есть только решение с нахождением точки:
bool PointBelongsSegment(DOT2D c, DOT2D a1, DOT2D a2)
{
c.x -= a1.x; c.y -= a1.y;
a2.x -= a1.x; a2.y -= a1.y;
if (fabs(c.x) > _E && fabs(a2.x) > _E)
{
if (c.x < 0 && a2.x > 0) return false;
if (c.x > 0 && a2.x < 0) return false;
if (fabs(c.x) > fabs(a2.x)) return false;
}
if (fabs(c.y) > _E && fabs(a2.y) > _E)
{
if (c.y < 0 && a2.y > 0) return false;
if (c.y > 0 && a2.y < 0) return false;
if (fabs(c.y) > fabs(a2.y)) return false;
}
return true;
}
bool IntersectSegments(DOT2D* a1, DOT2D* a2, DOT2D* b1, DOT2D* b2, DOT2D* c)
{
if (IntersectLines(a1,a2,b1,b2,c)) return true;
if (!PointBelongsSegment(*c, *a1, *a2)) return true;
if (!PointBelongsSegment(*c, *b1, *b2)) return true;
return false;
}
Gregory_krovosos
спасибо, изучим.
я правда уже воспользовался решением, через параметричекое представление прямых,
как-нибудь проанализирую твою и свою версию на сложность кода.
BloodAxe
Там гравитация периодически меняется, сначала вниз, потом отключается, потом вверх, потом отключается ...
Кажется есть параметр в ini-файле для периода...
EvilSpirit
Увидел коляску (car09.joi). Упал пацтул! Рулёз! Особенно когда разгонишься и катиться начинает вся коляска (не ехать, а катиться).
А как трассу редактировать? Чёто в MAPEDIT.EXE f2 и f3 не работают - вылетает. А так я свою тачку даже сделал - устойчивую, с 7-ю колёсами. Здорово. Игруху бы такую - конструктор - типа игрок гоняет (пока не представляю как именно) на тачках, за победу в гонках дают joint-ы и короче тачку можно модифицировать. М-да... дурацкая идейка.
Gregory_krovosos
>Найти формулы для импульсных контактов в инете - проще простого.
Ггде?
Откуда всё это взялось:
Vab_после_удара = –E * Vab_до удара J = normal.x * (normal.x * m1->antiM - R1.y * Z1 + normal.x * m2->antiM + R2.y * Z2) + normal.y * ( normal.y * m1->antiM + R1.x * Z1 * m1->antiI + normal.y * m2->antiM - R2.x * Z2 * m2->antiI); impulse = ( MIN_V - ( 1 + E) * Vab( ) ) / J;
и особенно вот это:
void BODY::apply_impulse(double x, double y, DOT2D normal, double impulse) { DOT2D RA( x - mass_x, y - mass_y); movement->V.x += impulse * normal.x * movement->antiM; movement->V.y += impulse * normal.y * movement->antiM; movement->W += impulse * ( normal.y * RA.x - normal.x * RA.y) * movement->antiI; }
Что такое импульс? Школьное определение "Физическая величина, равная произведению массы тела на скорость его движения, называется импульсом тела." в ету функцию мягко говоря не подходит, а грубо говоря вообще в школьной физике (да и в универе я чё-то такого не помню) ничё кроме как столкновения шаров (и то, только центральные удары, общий случай - только мельком можт и встречается где) и сцепления колёс толком ничего и нету. Уж про смешанное движение (поступательное+вращательное) я вообще молчу. Т.е. сами "уравнения" есть, но вот удара... т.е. чтоб бильярдные шары закручивались при ударе - такого я вапще не видел. Короче, ткни пальцем, если не трудно, где это искать. (Бараффа не предлагать!)
И какая связь импульса и момента импульса?
Кстати насчёт нестабильности. Попробуй выталкивать тела друг из друга при ударах, т.е. чтобы они никогда не проникали друг в друга (но и чтобы зазора между ними не было).
И к тому же, ИМХО, такие замуты с контактами не нужны. Я в своё время делал так (...правда работало всё это хреново). За шаг dt строится траектория каждого тела (если силы не действуют или не охота интегрировать, то это просто прямая), находится объём (в 2D - плоская фигура), которую образует тело при движении за время dt. Далее ищешь все пересечения всех тел (как пересечение объёмов перемещений) каждый раз каждый кадр (ну, с оптимизацией искать только для тех тел, которые потенциально могут столкнуться). Причём искать надо не только факты ударов, а ещё и время столкновения, т.е. искать точку на траектории обоих тел, когда же они "поцелуются". :-)
И после того, как все контакты нашёл, берёшь самый ранний, обрабатываешь столкновение, удаляешь этот контакт, а затем удаляешь из списка контактов все содержащие эти 2 только что столкнувшихся тела, перемещаешь все тела на время t (t<dt) и перепроверяешь столкновения всех тел с двумя телами, только что участвовавшими в этом контакте.
---
Ета идея была положена в основу моей муры ("физ. движка"), которую я обозвал SIDE (Step Independent Dynamics Engine). Изначально (ну, на этом всё и закончилось) поддерживались только шарики и я даже пытался сделать модель вселенной: создаю штук 500 сфер равномерно распределённых в кубе на довольно большом расстоянии друг от друга (типа облако материи) и даю им скорость разлёта в зависимости от их расстояния до центра (ну, вселенная сейчас расширяется) и наблюдаю - со временем наиболее близкие шарики объединяются в кучки (в звёзды и планеты наверное), в центре всегда самая большая куча шариков, более мелкие начинают вращаться вокруг планет по эллиптическим орбитам, всё крутится, вертится, весело короче. :-) Хотя планеты не стабильны (подёргиваются иногда, т.к. состоят из десятков шаров, а если один огромный массивный шар сделать, то всё стабильно, не дёргается). И однажды чё-то глюкануло и самая большая звезда как взорвётся - все шарики её составляющие вдруг начали разлетаться в разные скорости и через пару секунд улетели из поля зрения, вот такой вот он, переменный шаг интегрирования. Ну это всё лирика, на чём я там остановился...
---
Столкновения (контакты) у меня хранились в виде <указатель на 1-е тело, указатель на 2-е тело, время столкновения (всегда меньше dt), ну и другая инфа>. И ещё - сила притяжения (гравитация) должна действовать только если тела не проникают друг в друга (типа реакция опоры компенсирует силу притяжения). У меня с этим были траблы. Хрен знает, может что-нить из всего этого бреда тебе поможет.
tav
Понимаешь, "импульс" здесь - некая эфемерная величина. Она физически не существует. Просто с введением этого понятия строится удобная и главное - весьма достоверная мат. модель.
Посылка такова: при ударе тела обмениваются импульсом (одинаковым по модулю и разным по знаку)по нормали удара, который их толкает и закручивает. Тела сопротивляются этому массой и моментом инерции. Так что по сути apply_impulse() не выводится, а постулируется.
Если ввести понятие E = "насколько изменилась относительная скорость точек удара до и после столкновения", то уже можно выписать формулы и вывести оттуда импульс, выраженный в скоростях до удара и этого E.
В интернете есть вывод этих формул, я поищу их на неделе. Там все не так уж сложно.
Школьная физика, увы - отдыхает! :-( Поверь мне, я просмотрел много учебников.
Кстати, я нашел эти формулы в книжке "Продвинутая анимация" или что-то в этом роде. Без вывода.
Если тебе интересно, я дома посмотрю точное название.
Насчет нестабильности = это можно решать по-разному. Я пришел к описанному решению и оно мне нравится.
Я к тому, что я не собираюсь пока улучшать движок - он и так хорош.
Тем более, я использую его пока в игре без гравитации ;)
500 сфер и каждая взаимодействует (притягивается) каждой?? Круто, это очень много.
Есть чертовски интересные примеры симуляции 2d/3d физики с примерами
http://uk.geocities.com/olivier_rebellion/ (от некоторых примеров челюсть непроизвольно пробивает пол)
очень полезный алгоритм Sweep Test - который просто не допускает "застревание" обьектов друг в друге http://www.gamasutra.com/features/19991018/Gomez_2.htm + http://members.gamedev.net/oliii/PolyColly3.zip
автор помимо самих исходников выложил еще и туториал (2D swept+overlap polygonal collision and response )
http://uk.geocities.com/olivier_rebellion/Polycolly.zip
все уже знают что тов. Кармак уже выложил в сеть исходники движка Q3, есть подозрения что он гораздо более полный и интересный, чем небольшие физические либы. так что мои пожления - не быть таким меркантильным (в любом случае похожие 2d engine исходники можно найти в сети, например http://flatland.sourceforge.net/ или http://www.cove.org/flade/) и делится с community, тем более что скорее всего кто-то из программерв помог и вам.
Gregory_krovosos
>Кстати, я нашел эти формулы в книжке "Продвинутая анимация" или что-то в этом роде. Без вывода.
Эх. Мне бы с выводом. Понять охота. А вообще, мне нужен только частный случай — для абсолютно-упругих ударов. Но закручивание должно учитываться. (Но это не бильярдные шары, просто одну физ. модель проверить надо.)
Можно конечно взять общую формулу и подставить E=1 и упростить, но... мне б знать откуда вообще исходить надо. По идее просто взять уравнения сохранения импульса, энергии (вращ. движ-е + поступ.) и момента импульса до и после удара, решить систему и всё, но чё-то не получается.
Zer0
Хм. Интересные примеры, конечно. (Особенно "verlet vehicle (wh1)", типа Elastomania), но... из чужих исходников вытащить теорию непросто, к тому же в "Cube collisions + exact contact point calculation (Cube3D)" кубики как-то странно себя ведут, трения вообще нет.
Va1 x|y = скорость 1-го тела до удара
Vb1 x|y = скорость 2-го тела до удара
Wa = угловая скорость 1-го тела до удара
Wb = угловая скорость 2-го тела до удара
Va2 x|y Vb2 x|y = скорости тел после удара
Wa2, Wb2 = угловые после удара
Nx, Ny = нормаль удара, направлена к первому телу
Rapx,Rapy = вектор из центра тела A в точку удара тела A
Rbpx,Rbpy = вектор из центра тела B в точку удара тела B
V a|b p 1|2 x|y = скорость точки удара соот-го тела до|после удара
E = упругость удара, 1 = абсолютно упругий, 0=абс. неупругий
j = импульс
Даны все скорости до удара.
Подставляй и получишь формулу для j.
Потом с ее помощью вычисляешь скорости после удара.
все :)
Gregory_krovosos
Хм. Всё равно ничё не понятно.
А можт есть где-нить статья на эту тему. А то я чё-то найти не могу в И-нете.
И вообще говоря, мне-то нужно в 3D. Кватернионы всякие и т.д.
tav
:-)))) Супер.
Gregory_krovosos
>:-)))) Супер.
В смысле?
Ну, единственно что нашёл (очень давно ещё, на винте валяется) -- "Физика контакта".
Но там тож понять... короче начиная с (6) формулы ниччё не понятно. Откуда она взялась ваще.
tav
Просто фраза понравилась: "ничего не понятно", это после 13 страниц рассуждений и статьи. :-)
Gregory_krovosos
А что статья? Там же не описываются физические основы симуляции. Там в основном про программирование движка. Я так и не понял как в демке рассчитывается момент инерции и центр масс многоугольников. Точнее как это в демке -- понятно, т.к. фигуры там простые, а если многоугольник произвольный? Можно, конечно, просто взять его BBOX, середину бокса принять за центр масс, а момент инерции найти как момент инерции описанного круга, но это не выход.
И вообще физику я до сих пор недопонимаю. Вот прикладывается к точке тела сила. Что с ним происходит в общем случае? Оно ускоряется и начинает вращаться. А как?
Если взять длинный стержень и на протяжении 1/100 с прикладывать некоторую силу к одному их его концов, направленную перпендикулярно стержню. Он будет вращаться и двигаться поступательно по направлению силы. Так? А если приложить силу к его центру, то вращаться он не будет, а поступательно двигаться будет быстрее. Так? А на сколько быстрее? А если момент инерции стержня будет почти равен нулю, т.е. почти вся его масса сосредоточена в его центре, тогда стержень поступательно двигаться почти не будет, а в основном только вращаться.
Если просто ускорить тело под действием силы, и взять эту же силу и приложить к телу момент этой же силы относительно его центра масс, заставив его вращаться, то получиться полнейший бред. В классической физике вообще рассматривается только случай когда одна из точек тела неподвижна и вращение может происходить только вокруг неё или же тело вращается вокруг некоторой оси (тогда момент инерции определяется теоремой Штейнера). И мне даже непонятно почему момент силы надо прикладывать относительно центра масс. А уж про то, момент КАКОЙ силы надо прикладывать я вообще молчу. А если речь идёт об ударе тел, то у меня даже версий нет, как это обрабатывать.
Ладно. Нашёл ещё вот здесь неплохие 4 статейки. Буду изучать.
Тема в архиве.