Діра в землі
Ціль проекту: створити 3D-відеогру з реалістичною фізикою, натхненну грою 2018 року Donut County. У цій грі гравець керує діркою в землі, яка збільшується в розмірах щоразу, коли в неї падає предмет, і врешті-решт стає достатньо великою, щоб поглинути цілі будівлі. Те, як має в підсумку виглядати гра тут.
УВАГА! Початковий код вже написаний і прикріплений у zip файлі. Доповніть код за завданням у папці src, у файлах App.ts і RigidBody.ts, не змінюйте наявний код, якщо цього не вимагає інструкція. Усі вимоги були перекладені з англійської, можуть бути спотворення.
УВАГА! Використовуйте локальну бібліотеку, без неї гра не запрацює!
1. Опис гри
Гра розроблена на основі схожої базової механіки, що й Donut County, хоча й з спрощеною фізичною моделлю. Користувач керує діркою за допомогою клавіш WASD/стрілок, миші або сенсорного екрану, і дірка буде збільшуватися щоразу, коли в неї падає об'єкт. На наступній схемі показана система координат, що використовується в грі. Зверніть увагу, що ми використовуємо стандартну правосторонню систему координат OpenGL, де +X — вправо, +Y — вгору, а -Z — вперед.
2. Вимоги
2.1 Керування отвором
В даний час користувач може переміщати отвір безкінечно в напрямках X і Z. Додайте перевірки меж, які не дозволять отвору покинути ігрову зону.
2.2 Переміщення сфер
Далі заверште код у класі RigidBody, щоб сфери рухалися відповідно до спрощеної фізичної моделі:
Рух: при реалізації фізики твердого тіла зміна положення об'єкта p обчислюється з використанням його швидкості v. Це відбувається в кожному кадрі в методі update() класу RigidBody, використовуючи формулу: p' = p + v * dt.
Гравітація: тверде тіло повинно прискорюватися вниз через гравітацію, але це повинно бути правдоподібне наближення гравітації. Врешті-решт, це гра, в якій об'єкти падають у магічну дірку в землі. Початковий код включає в себе гравітаційну константу, використану в прикладі інструктора.
2.3 Обробка зіткнень на межі
У будь-якій процедурі обробки зіткнень є два основних кроки: по-перше, визначення того, чи сталося зіткнення, і, по-друге, вирішення зіткнення шляхом оновлення положень і швидкостей зіткнувшихся об'єктів.
Виявлення зіткнень: Пам'ятайте, що в цьому типі моделювання ми оновлюємо положення і швидкості один раз за кадр, і між кожним кадром є невеликий проміжок часу (dt). Нам потрібно пам'ятати, що час, коли два рухомих об'єкти стикаються, ймовірно, не буде точно кратним dt. Це означає, що важливо не просто обробляти випадок, коли два об'єкти спочатку ідеально торкаються один одного. Також важливо обробляти випадок, коли вони, можливо, тільки що торкнулися один одного частку секунди тому. Це проілюстровано нижче. На часовому кроці 1 м'яч ще не торкнувся стіни, але він рухається досить швидко, щоб, якщо ми перемістимося на dt і перейдемо до часового кроку 2, м'яч фактично пробив стіну!
Якщо ви оновлюєте свою симуляцію один раз у кожному кадрі, це означає, що пройшовший час (тобто deltaTime або dt) між послідовними кадрами буде десь близько 1/30–1/60 секунди. Це швидко, але все ще недостатньо швидко, щоб захопити точний момент, коли два тверді тіла вперше стикаються.
Спосіб обробки нереалістичної поведінки, подібного цьому, полягає в його виявленні та виправленні. З точки зору вашого коду, виявлення зіткнень вимагає оцінки відстані між двома об'єктами, і ви можете, природно, написати перевірку для цього, використовуючи оператор if, наприклад, «if (currentDistanceBetweenObjects == distanceWhenObjectsAreJustTouching)». У цьому випадку дуже легко виявити ситуацію, таку як Timestep 2, просто змініть «==" у вашому операторі if на «<=".
Оновлення положення: щоб виправити ці ситуації, ви повинні встановити положення сфери на нове значення, при якому вона не буде проникати в інший об'єкт. Існує кілька допустимих підходів залежно від того, наскільки точно ви хочете бути в розрахунках. Для меж ігрової зони ми рекомендуємо встановити положення сфери на найближче допустиме положення, чого можна досягти, переміщуючи сферу в напрямку, перпендикулярному стіні, яка була перетворена. Наприклад, якщо ви виявили, що положення сфери по осі X занадто велике, просто встановіть його положення по осі X на найближче допустиме значення. Для зіткнень між двома сферами ми рекомендуємо розрахувати найкоротшу відстань, яку потрібно буде пройти сферам, щоб більше не проникати одна в одну, а потім перемістити кожну сферу на половину цієї відстані. Ми обговоримо ці розрахунки та різні альтернативи в класі.
Оновлення швидкості: коли тверде тіло відскакує від іншого об'єкта, його швидкість v змінюється, але як? Це залежить від нормалі поверхні, з якою вони стикаються. На наступному малюнку показана сфера, що відскакує від площини землі. У цьому випадку обчислення оновлення швидкості сфери дуже просте; ми просто заперечуємо v.y, залишаючи v.x і v.z незмінними.
Аппроксимація тертя: для імітації тертя можна просто зменшити швидкість твердого тіла, коли воно вдаряється об щось. Наприклад, можна помножити поточну швидкість на 0,9 після відскоку, що сповільнить його на 10% через тертя. Стартовий код вже включає параметр сповільнення тертя, використаний в прикладі.
2.4 Обробка зіткнень сфера-сфера
Підсумовуючи, для випадку сфера-сфера кроки будуть наступними:
1. Визначте, що дві сфери зіткнулися (і, ймовірно, проникли одна в одну).
2. «Виправте» зіткнення, відрегулювавши положення обох сфер так, щоб вони більше не перетиналися.
3. Для кожної сфери обчисліть її нову швидкість після зіткнення, не забуваючи використовувати правильну нормаль зіткнення та відносну швидкість.
Нарешті, трохи зменшіть швидкість кожної сфери, щоб врахувати тертя.
Слід згадати спрощуючі припущення: на додаток до спрощеної гравітації та тертя наш підхід припускає, що ці сфери мають однакову масу, тому нам не потрібно вирішувати рівняння збереження імпульсу, хоча ви цілком можете це зробити, щоб зробити більш реалістичну симуляцію. Крім того, ми не розглядаємо випадки, коли в одному кадрі стикаються більше двох об'єктів. Іноді через це ви можете побачити артефакт у своїй симуляції. Можливо, але це виходить за рамки цього завдання, обробляти всі ці випадки.
2.5 Створіть свою власну гру
У останній частині вам слід додати код у метод startNextStage(), щоб створити власну сцену, яка буде завантажена після того, як користувач завершить тестову сцену. У вас є багато свободи для створення власної гри, поки вона відповідає цим мінімальним вимогам:
Ваша гра повинна включати не менше 8 твердих тіл.
Кожне тверде тіло повинно відрізнятися за розміром.
Щоб виграти в грі, спочатку потрібно захопити кілька менших твердих тіл, щоб отвір став достатньо великим для захоплення більших твердих тіл.
Тверді тіла повинні рухатися, щоб гра була цікавою. Як мінімум, їх можна ініціалізувати зі випадковими швидкостями, але ви також можете зробити щось більш креативне тут, наприклад, побудувати машину Руба Голдберга. або розташувати їх у вигляді якоїсь головоломки.
Додатки 4
Відгук замовника про співпрацю з Павлом Шевчуком
Діра в земліЧудова співпраця, відгукливість та своєчасність. Проект працює при дотриманні інструкцій. Проект був складний, OOP з складними математичними обчисленнями, Павло впорався з усіма завданнями відмінно
Відгук фрилансера про співпрацю з Софьєю К.
Діра в земліДуже хороше тз. Хороша комунікація. Рекомендую співпрацю
-
Переможець3 дні3105 UAH
729 10 0 Переможець3 дні3105 UAHГотовий завершити роботу. У мене є досвід роботи з складним OOP-додатком, який включає багато математики.
https://cad.emachineshop.com/#/share/GeMIcbY7UhRKQKfgjsFeTBAcRgSAHAl42J0Lclg6
Актуальні фриланс-проєкти в категорії Javascript та Typescript
Шукаю наставника з Claude Code для запуску веб-проєкту з нуля**Коротко про завдання:** Я новачок без досвіду в програмуванні. Є готове ТЗ на розробку сайту (42 сторінки, Next.js, PostgreSQL). Хочу реалізувати його самостійно за допомогою Claude Code - потрібен спеціаліст, який налаштує середовище і навчить мене працювати з інструментом.… Javascript та Typescript, Навчання ∙ 18 годин 31 хвилина тому ∙ 15 ставок |
Оновлення дизайну на сайтіПотрібно оновити дизайн існуючого сайту, використовуючи HTML, CSS, JS: освіжити зовнішній вигляд, зробити його сучасним і адаптивним під мобільні пристрої. Потрібно додати плавні анімації та інтерактивні елементи. HTML та CSS верстання, Javascript та Typescript ∙ 1 день 12 годин тому ∙ 85 ставок |
Консультація та аудит поточного проєкту на Odoo 19 Community EditionШукаємо Odoo Developer — соло-розробника з досвідом розробки на Odoo 19 Community Edition, у тому числі за допомогою Claude Code. Нам потрібен спеціаліст, який має успішно реалізовані проєкти в Odoo та практичний досвід розробки з використанням Claude Code. Важливо: розглядаємо… C та C++, Javascript та Typescript ∙ 1 день 17 годин тому ∙ 5 ставок |
Інтернет-магазину одягуПотрібен розробник для інтернет-магазину одягу Шукаю досвідченого розробника для створення повноцінного інтернет-магазину одягу з дроп-моделлю продажу. Що потрібно зробити: 6 сторінок: головна, товар, кошик, оформлення, акаунт, адмін панель Вхід через Google акаунт Кошик і… HTML та CSS верстання, Javascript та Typescript ∙ 3 дні 14 годин тому ∙ 101 ставка |
Розробка повного стеку — Панель управління Amazon PPC (Етап 1)Потрібен full-stack розробник з досвідом роботи з Amazon API для реалізації Stage 1 внутрішнього PPC-дашборда. Проект реальний, дані живі, все готово до старту. Прототип фронтенда (5 сторінок, React + TypeScript): ЩО ВЖЕ ГОТОВО — Фронтенд-прототип на React 18 + TypeScript +… Javascript та Typescript, Веб-програмування ∙ 6 днів 1 година тому ∙ 32 ставки |