Pull to refresh

1-я, 2-я и 3-я космические скорости на ленте Мёбиуса

Level of difficultyMedium
Reading time5 min
Views7K

Продолжаю работу над 3D-игрой с перемещением игрока по поверхности ленты Мёбиуса. Сегодня мы разберём гравитационную модель окрестностей этого тела.

Прошлая статья была посвящена реализации биомеханических прыжков и приданию им реалистичности с помощью PD-контроллера. Эти механики предназначены для использования вблизи поверхности ленты. В качестве геометрической области их применения был назначен тор, содержащий ленту Мёбиуса (представлен на рисунке).

 Тор, содержащий ленту Мёбиуса
Тор, содержащий ленту Мёбиуса

В этот раз мы разберём модель гравитации ленты за пределами ограничивающего тора.

Модель гравитации должна определять вектор силы, действующей на единицу массы в заданной точке. Иными словами, нам нужна функция, ставящая в соответствие каждому значению радиус-вектора материальной точки заданной массы единственное значение вектора силы притяжения. В соответствии со вторым законом Ньютона такая функция для материальной точки любой массы с заданным радиус-вектором будет определять ее гравитационное ускорение в направлении притягивающей «Земли — Ленты Мебиуса». Отсюда душевное название метода, реализующего гравитационную модель, вот его листинг:

        static public Vector3 GoHomeAccel(Vector3 position)
        {

                Vector3 projOnWorldPlane = position;

                projOnWorldPlane.z = 0f;

                projOnWorldPlane = projOnWorldPlane.normalized;

                Vector3 grndOrig = projOnWorldPlane * terrainRadius;

                Vector3 target = grndOrig - GetLocalGravity(position) * GO_HOME_POINT_H;

                return (target - position)* GO_HOME_COEF;

       }    

Большая часть тела метода GoHomeAccel(), точнее, все его тело, кроме строки с оператором return, решает задачу определения позиции «центра притяжения» Ленты Мебиуса (переменная target). Логика расчета не слишком далека от сильно упрощенной физической модели с небольшим ухищрением, исключающим регулярные прилеты игрока из космоса в ребро ленты.

Строка с оператором return отвечает за выдачу вектора гравитационного ускорения. Рассмотрим два варианта кода этой строки:

–         текущую версию (листинг выше), «гравитация по закону Гука»;

–         версию гравитации по закону всемирного тяготения (описана ниже).

При использовании в игре закона Гука персонаж не сможет достичь второй космической скорости. Лента будет “удерживать” его на какой-то орбите и не даст возможности покинуть её, ведь как бы персонаж ни разогнался, возрастающая с удалением от ленты «сила упругости» рано или поздно достигнет такого значения, при котором игрок не сможет её преодолеть.

Рассмотрим подробнее закон, реализованный в скрипте “WorldPhysics”:

return (target - position) * GO_HOME_COEF;

В физике закон Гука имеет вид:

F_{упр} = k * \Delta l,

 где Fупр – сила упругости, k – коэффициент упругости, Δl – абсолютное удлинение тела. Разделив обе части уравнения на массу игрока, получим слева ускорение, создаваемое силой упругости. Теперь формула легко сопоставляется со строкой кода, поскольку возвращаемое значение и есть ускорение, создаваемое «силой упругости».

В скрипте (target - position) – вектор, задающий направление силы, действующей на персонажа со стороны ленты и притягивающей его, а модуль этого вектора играет роль абсолютного удлинения упругого тела, то есть, по аналогии с законом Гука, соответствует величине Δl. Если наш радиус-вектор position совпадает с target, то никакого удлинения нет, невидимая пружина, тянущая нас «домой», не растянута, мы дома. GO_HOME_COEF – константа, выполняющая роль коэффициента гравитации, соответствует отношению коэффициента упругости k к массе игрока.

Постоянство указанного отношения означает, что воображаемая «гравитационная пружина» имеет жесткость, пропорциональную массе притягиваемого тела, а создаваемое ею ускорение материальной точки зависит от ее текущей позиции, но не зависит от массы.

Нетрудно определить размер области возможных полетов, если после прыжка игрок предоставлен только «упругой гравитации».

Достаточно приравнять кинетическую энергию игрока на старте к потенциальной энергии «пружины» и выразить ее абсолютное удлинение (оно же максимальная дальность полета):

Δl_{max} =\frac {V_0} {\sqrt{GO\text_HOME\text_COEF}},

где V0 – начальная скорость.

Для замены закона Гука на закон всемирного тяготения нам необходимо изменить только строку кода, возвращающую результат из GoHomeAccel(). Вот так она должна выглядеть:

return (target - position).normalized * TOR_GRAVITY_COEF/((target-position).sqrMagnitude);

Cравним закон всемирного тяготения, реализованный выше, с его формулой из учебника физики.

Закон всемирного тяготения описывается уравнением:

 F = \frac{G * m_1 * m_2} { r^2},

 где G – гравитационная постоянная, m1 – масса первого тела, m2 – масса второго тела, r2 – квадрат расстояния между двумя телами.

Находим аналогии в формулах: TOR_GRAVITY_COEFG*m1, где m1 – масса тора, (target-position).sqrMagnitude – квадрат расстояния между телами r2. Таким образом, возвращаемое кодом значение – ускорение свободного падения на ленте Мёбиуса (после деления обеих частей уравнения на m2: a = F/m_2 = G*m_1/r^2) в векторной форме.

Итак, закон всемирного тяготения реализован, теперь подберем к нему значение константы TOR_GRAVITY_COEF.

Я провел эксперименты с варьированием значений TOR_GRAVITY_COEF в интервале от 50 до 150. Ленту можно покидать по-разному: выйти за край, выбежать за край, прыгнуть с края вертикально вверх и прыгнуть за край с разбега. Вектор исходной скорости относительно ленты в этих вариациях будет различаться как по модулю, так и по направлению.

Кроме того, выходы и выбеги за край могут проходить поперек края или с каким-то углом наискось.

Добавим еще один фактор: одинаковый выход за край в разных точках Ленты ведет к разной механике дальнейшего движения в космосе.

Не нужно углубляться в комбинаторику, чтобы понять: для исчерпывающего исследования поведения игрока в гравитационном поле Ленты даже с одним значением TOR_GRAVITY_COEF нужны тысячи экспериментов и долгие недели полетов (альтернатива — создание численных или аналитических моделей и воплощение их в коде, но это же не так весело как играть в игру тысячи раз).

Но если принять во внимание, что нам не нужны какие-то статистически достоверные точные исчерпывающие описания, а нужна по сути экспертная оценка «развлекательности» физики… Все становится несколько проще.

Ниже представлены некоторые результаты моих изысканий.

TOR_GRAVITY_COEF = 113

В общем и целом невозможно улететь в космос, что показано на скриншотах траекторий ниже.

Очевидно, очень трудно или невозможно достичь даже первой космической скорости. Разумеется, термин «первая космическая скорость», применим здесь весьма условно, хотя бы потому, что Лента Мебиуса мало напоминает планету. Тем не менее, ниже мы увидим даже некое подобие движения по орбите.

TOR_GRAVITY_COEF = 80

Значение TOR_GRAVITY_COEF = 80 оказалось слишком мало: игрока мог отправить в космос любой необдуманный прыжок с края ленты (и не только оттуда!).    В общем, стало довольно трудно побывать в открытом космосе, не улетев в него безвозвратно.

Достижение второй космической скорости
Достижение второй космической скорости

TOR_GRAVITY_COEF = 100

При этом значении персонаж не улетает безвозвратно в открытый космос при каждом прыжке, но имеет возможность двигаться по орбите ленты, перескакивая с одного ее “края” на другой в конце своего движения, а также выходить на орбиту и покидать её.

Достижение первой космической скорости
Достижение первой космической скорости
Траектория движения по орбите
Траектория движения по орбите
Достижение второй космической скорости
Достижение второй космической скорости

Вероятно, значение TOR_GRAVITY_COEF = 100 близко к наилучшему варианту. Оно позволяет летать по интересным траекториям, при этом не каждый раз улетая безвозвратно в пустоту. В то же время, доля таких улетов остается значительной.

В этом минус модели физической гравитации по сравнению с гравитацией по закону Гука: слишком тонкая грань отделяет развлекательные прыжки с витками по орбитам от билета в один конец (вторая космическая скорость для Земли составляет 11,2 км/с, а первая — 7,9).

Солнце и третья космическая скорость

При добавлении в игру Солнца возникнет актуальность и третьей космической скорости.

Для того, чтобы покинуть систему тел, которая будет создана далее, игроку понадобится некоторый внешний импульс, поскольку сам он не в состоянии достичь третьей космической скорости. Для этого нам нужен будет реактивный ранец/ракета или любые другие средства передвижения, которые я планирую сделать в следующих версиях игры.

Помимо выхода за пределы системы ранец и ракета могут упрощать достижение второй космической скорости и передвижение между небесными телами.

Посмотреть текущий код проекта и “поиграть” с коэффициентами можно взяв проект на GitHub. Основы механики игры описаны в первой статье.

Tags:
Hubs:
Total votes 7: ↑7 and ↓0+8
Comments8

Articles