Hole in the Ground
3104 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 дня3104 UAH
729 10 0 Победившая ставка3 дня3104 UAHГотов завершить работу. У меня есть опыт работы со сложным OOP приложением, которое включает в себя много математики.
https://cad.emachineshop.com/#/share/GeMIcbY7UhRKQKfgjsFeTBAcRgSAHAl42J0Lclg6
Актуальные фриланс-проекты в категории Javascript и Typescript
Интернет-магазин одеждыНужен разработчик для интернет-магазина одежды Ищу опытного разработчика для создания полноценного интернет-магазина одежды с дроп-моделью продаж. Что нужно сделать: 6 страниц: главная, товар, корзина, оформление, аккаунт, админ панель Вход через Google аккаунт Корзина и… HTML и CSS верстка, Javascript и Typescript ∙ 10 часов 24 минуты назад ∙ 63 ставки |
Full-stack разработка — Amazon PPC Dashboard (Stage 1)Нужен full-stack разработчик с опытом работы с Amazon API для реализации Stage 1 внутреннего PPC-дашборда. Проект реальный, данные живые, всё готово к старту. Прототип фронтенда (5 страниц, React + TypeScript): ЧТО УЖЕ ГОТОВО — Фронтенд-прототип на React 18 + TypeScript + Vite… Javascript и Typescript, Веб-программирование ∙ 2 дня 21 час назад ∙ 28 ставок |
Разработка сайта-конструктора фотокниг и фоторамокЦель проекта Необходимо разработать современный веб-сайт для заказа фотокниг, фоторамок и другой персонализированной фотопродукции. Главная задача проекта — предоставить клиенту возможность самостоятельно создать готовый макет изделия непосредственно на сайте без участия… Javascript и Typescript, Веб-программирование ∙ 4 дня 13 часов назад ∙ 96 ставок |
Команда для самописного маркетплейса ритуальных услуг.Ищем команду для запуска и развития самописного национального маркетплейса ритуальных услуг. Сразу: не ищем одиночек, джунов и “сборщиков сайтов”. Нужна сильная продуктовая команда уровня middle+/senior с реальными кейсами маркетплейсов/сложных SaaS. Просьба не откликаться,… Javascript и Typescript, Веб-программирование ∙ 5 дней 8 часов назад ∙ 27 ставок |
Доработка существующего Next.js/Supabase проекта: офферы, CRM, аналитика, AI-чатЕсть действующий проект WatchGenius — платформа аналитики люксовых часов с каталогом моделей, ценовой аналитикой, внешними офферами, формами заявок и AI-чатом. Проект уже разработан частично. Нужен не сайт с нуля, а опытный full-stack разработчик, который сможет разобраться в… Javascript и Typescript, Веб-программирование ∙ 7 дней 9 часов назад ∙ 55 ставок |