Как симулация физика в игрите по примера на куршум физика

Много съвременни игри използват физическа симулация. Първото запознаване с физиката на двигателя като цяло е обещаващо. Топката скача от куба и ролки до дъното на наклонен, но в този процес, когато проектът е почти готов, се оказва, нещо не работи както трябва. Тук можете да съсипе много време.

И ако Nvidia Physix (Unity3D здрасти) можеш да направиш нищо, с изключение на един чифт параметри, куршумът физика Box2D и на разположение в изходен код, и от bezishodnosti започне да се занимава с това, че и двете работи вътрешно.

За да се справят с работата, на начина, по който нещата е много полезно. Всички игра физика двигател са много сходни. Те всички импулс база, което означава, че във всяка симулация рамка всички (властта) се превръща в импулси, се добавят импулси, разделена на масата и се добавя към скоростта (линейни и vraschatelnoy) на обекта, скоростта също определя колко обекта ще се премести в сегашната рамка на симулацията.

И тогава възниква въпросът, ако всичко е толкова просто, как тя е, че можете да поставите в блоковете на колоните, и те са в мир, и не се разпръсне?

Ще покажем, че за всичко това магия отговаря малко парче код!

Предполагам, че читателят вече знае, че физиката на двигателя, има два основни типа симулирани тел: твърдо тяло (еластична тяло, движения и има Masa) и статично тяло (фиксиран тяло неподвижно и тегло не трябва). Кинематичен и меко тяло не си струва вниманието.

Сблъсък Откриване

Магията започва, когато две тела се допират. В Bullet се използва терминът физика сблъсък.

Системата трябва да се идентифицират всички органи, които се занимават с друг в рамките на симулацията. Всяко докосване (конфликт) може да участва и още 2 тела. Търсене всичко възможно докосване може да бъде много-много ресурси.

Broadphase сблъсък откриване

Първата фаза - е да се намери пресечната точка на кутии AABB. AABB - това са две точки, които описват една кутия, вътре в който е обект. Идеята е, че ако два обекта се пресичат, и кутиите им AABB пресичат.

Този проблем е BulletPhysics решава един от трите алгоритми. Те са реализирани като класове, които реализират btBroadphaseInterface.

1. Най-очевидният и неефективно btSimpleBroadphase, просто търсене на всички двойки от О (п ^ 2).

2. btAxisSweep3 работещи в ограничени пространства. Вие питате AABB поле, в рамките на който ще се приема, че всички обекти. Това може да изглежда неудобно, но се дължи на факта, че броят на стойности с плаваща точка с увеличаване на точността на загубите, все още не може да се симулира нещо на разстояние от един милион единици по такъв начин, като че ли го е направил на разстояние от 10 единици от произхода (единица обикновено се счита за m).

3. btDbvtBroadphase организира обекти в два дървесни структури, по един за статични обекти, а другата за динамична (твърда, кинематичен) тел.

Narrowphase сблъсък откриване

След като намери група от обекти, чиято кутия AABB пресече, се проверява дали има пресечната точка в действителност.

Тук трябва да се помни, че всички обекти, дадени от форма (форма), могат да бъдат една сфера, цилиндър, бокс, изпъкнал Стол за твърдо тяло или полихедронов за статично тяло. Освен това има и композитен форма от формите, изброени в предходното изречение.

За всяка двойка дефинирани алгоритъм и намирането на точките на пресичане на вертикалите.

Как симулация физика в игрите по примера на куршум физика

Отлично, всички кръстовища са открити, какво да правя след това? Всеки двигател в нашия импулс на базата, че е необходимо да се изчисли инерция, която набута два подслушване обект, за да изглежда по-реалистично.

Тогава обещах, че ще има една малка част от кода. Мисля, че преди две години е било всичките три реда, но сега тя изглежда така.

На входа имаме две тела бяха трогнати, точката на контакт с нормалната докосване и в резултат имаме два импулси, които трябва да разрешаване на конфликта, принуждават кутията тихо и неподвижно лежи един към друг, както и с цилиндъра и топката гладко и реалистично се търкаля надолу.

Полезен съвет вместо сбогом

Докоснете този код не е необходимо. Например, ако се разработи игра с състезателна кола, и колата ще отида на бордюра или на стената, и тя ще се държи непредсказуемо и не играе, трябва да се обърне внимание на перпендикуляра на допирната точка. Това непостоянство и предвидимост на перпендикуляра в точката на контакт е често не се определя от предвидимостта на симулация.

Можете надникна в душата на съвременната физика двигател и сега е длъжен да се омъжи за него.