Hole in the Ground
3145 UAHЦель проекта: создать 3D-видеоигру с реалистичной физикой, вдохновленную игрой 2018 года Donut County. В этой игре игрок управляет дырой в земле, которая увеличивается в размерах каждый раз, когда в нее падает предмет, и в конечном итоге становится достаточно большой, чтобы поглотить целые здания. То как должна по итогу выглядеть игра здесь.
ВНИМАНИЕ! Начальный код уже написан и прикреплен в зип файле. Дополните код по заданию в папке 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
Отзыв заказчика о сотрудничестве с Павлом Шевчуком
Hole in the GroundОтличное сотрудничество, отзывчивость и своевременность. Проект работает при соблюдении инструкций. Проект был сложный, OOP со сложными математическими вычислениями, Павел справился со всеми задачами отлично
Отзыв фрилансера о сотрудничестве с Софьей К.
Hole in the GroundОчень хорошее тз. Хорошая комуникация. Рекомендую сотрудничество
-
Победившая ставка3 дня3145 UAH
729 10 0 Победившая ставка3 дня3145 UAHГотов завершить работу. У меня есть опыт работы со сложным OOP приложением, которое включает в себя много математики.
https://cad.emachineshop.com/#/share/GeMIcbY7UhRKQKfgjsFeTBAcRgSAHAl42J0Lclg6
Актуальные фриланс-проекты в категории Javascript и Typescript
Оптимизация Core Web Vitals (OpenCart) под Google PageSpeed — Мобильная и ПК версииОписание заказа: Ищем опытного frontend-разработчика/специалиста по OpenCart для оптимизации скорости загрузки сайта (категории и карточки товаров) под требования Google Core Web Vitals. О проекте: * CMS: OpenCart. * Специфика: Сайт работает в режиме каталога (корзины и… CMS, Javascript и Typescript ∙ 2 дня 2 часа назад ∙ 17 ставок |
Оптимизация скорости сайта WordPress
5092 UAH
полные детали отправим в личные сообщения Цель Максимально ускорить загрузку сайта, особенно на мобильных устройствах. KPI (обязательно) После завершения работ необходимо добиться следующих показателей. Mobile Performance 90+ LCP менее 2.2 сек INP менее 200 мс CLS менее 0.1… HTML и CSS верстка, Javascript и Typescript ∙ 2 дня 21 час назад ∙ 66 ставок |
Интеграция калькулятора стоимости услуг на сайт Webflow
14 825 UAH
Ищем разработчика для интеграции готового калькулятора стоимости услуг на наш сайт, созданный на Webflow. О компании Мы занимаемся: сборкой мебели; монтажем телевизоров; монтажем полок, картин, зеркал и других предметов; помощью при переезде; подъемом тяжелых предметов; услугами… Javascript и Typescript, Веб-программирование ∙ 2 дня 22 часа назад ∙ 64 ставки |
Ищем Odoo Developer — соло-разработчика с опытом разработки на Odoo 19 Community EditionЕсть рабочий, чисто спроектированный проект на Odoo 19 Community — CRM для украинского отеля, уже в production-grade инфраструктуре. Переписывать с нуля не планируем. Ищем одного человека, который подхватит проект, сохранит работоспособное и поведет его дальше: сначала CRM →… Javascript и Typescript, Веб-программирование ∙ 4 дня 23 часа назад ∙ 2 ставки |
Ищу опытного Full Stack разработчика для создания SaaS-сервиса для интернет-магазинов.Идея сервиса: Клиент загружает ссылку на свой товарный фид (XML или CSV). Сервис автоматически получает товары, берет их фотографии и создает новые рекламные изображения по готовым шаблонам: цена, скидка, логотип, акционные плашки и т.д. Также в сервисе должен быть простой… Javascript и Typescript, Веб-программирование ∙ 6 дней 5 часов назад ∙ 87 ставок |