Я разрабатываю игру, в которой игрок может использовать верёвки для качания (точно так же, как это делал Spiderman или Bionic Commando ), и у меня возникли проблемы с реализацией этого поведения. Может ли кто-нибудь помочь мне, как это сделать, я имею в виду физические формулы и т. Д. До сих пор у меня есть 3 идеи. Каждый использует весну, но он отнимает много времени, а иногда и нервный. Два других пытаются вычислить следующий шаг (один с помощью вычисления потенциальной энергии и один с помощью вычисления крутящего момента), и оба они почти терпят крах, когда актер пытается раскачиваться.
Вот код, который я написал для расчета крутящего момента:
float dx = Runner->getPosition().x - ancher.x;
float dy = Runner->getPosition().y - ancher.y;
float t0 = atan2(dy,dx); //my current angle
float k = ((dy) *vx - (dx) * vy) / (dx * dx+dy * dy); //previus angular velocity
k -= gravity * cos(t0) *dt; // new angular velocity (gravity is positive)
t0 += k * dt - acc * cos(t0) *dt * dt / 2; // rotate the rope
float dx1 = r0 * cos(t0); // new position (r0 is rope length)
float dy1 = r0 * sin(t0);
vx = (dx1 - dx) / dt; //calculate velocity
vy = (dy1 - dy) / dt;
physics
platformer
rope-physics
Ali1S232
источник
источник
Ответы:
Если вам нужно жесткое колебание, чтобы расстояние до точки вращения было постоянным, просто обработайте символ как точку на окружности с центром в точке вращения. Дайте ему одномерную (по кругу) угловую скорость. В каждом кадре угловое ускорение должно быть
accelerationDueToGravity * cos(angleOfPlayerOnCircle)
(с направлением 0 градусов вправо).Если вы хотите, чтобы веревка становилась длиннее / короче, вы можете использовать приведенную выше схему и просто изменять радиус каждого кадра.
источник
после многих попыток я пошел с box2d.
Есть всего два подхода к этому моделированию или, по крайней мере, я нашел 2:
в каждом сенарио у вас должен быть якорь (который в моем случае был статическим блоком). лучше, если вы уменьшите вес частей веревки (либо вы будете использовать форму круга или форму прямоугольника), например, чтобы получить более реалистичную физику, я установил их плотность на 0,1, а для коробки, соединенной на конце веревки, я использовал плотность 10.
Другое дело, что вам нужно беспокоиться о том, как ваш сегмент веревки реагирует друг на друга. я просто хотел, чтобы моя веревка свободно двигалась в сцене, поэтому я обозначил все крепления веревки как датчики. вам может понадобиться другой подход.
следующая вещь, о которой вам нужно беспокоиться, это количество итераций, которые вы вставляете в обновление для мира: для низкого сегмента веревки (возможно, максимум 8) нет необходимости использовать высокое значение итерации, например 10/10, который предложил сам box2d. этого достаточно, но если вы увеличите число сегментов, например, я попробовал 30 сегментов, при небольшом количестве итераций ваша веревка, кажется, увеличивает свою длину больше, чем должна, поэтому вам, возможно, потребуется около 40/40 итераций для решения этих ситуаций.
после некоторого тестирования кажется, что коробка 2d предназначена для сцен с размерами объектов от 0,1 до 10 м, а максимальный размер, рекомендуемый для больших сцен, составляет около 50 х 50 м. так что по сути вам нужно уменьшить ваш объект, чтобы соответствовать этим параметрам. в моем случае я сначала попытался передать положения пикселей непосредственно в box2d, но казалось, что существуют некоторые ограничения скорости, мешающие миру двигаться так быстро, как следовало, поэтому мне пришлось масштабировать свою сцену примерно в 64 раза, чтобы получить лучшие результаты. хотя я не проверял себя, в box2d есть некоторые ограничения, которые мешают вам использовать большие сцены. например, в
b2Setting.h
файле есть определенное значение,#define b2_maxTranslation 2.0f
вы можете изменить настройки box2d, но это не рекомендуется.источник
Рассматривали ли вы возможность замедления скорости поворота, основываясь на том, как далеко верёвка находится от отвеса (центра)?
источник
Когда игрок находится дальше, чем длина веревки, игрок будет немедленно отброшен назад с силой, равной расстоянию, которое он прошел. Это должно работать без ощущения упругости и должно быть интуитивно понятным для игрока. Возможно, вам придется настроить физику, чтобы получить лучшие результаты для вашей игры.
Когда веревка прикреплена. Сохранить
maxLength
значение.Каждое обновление проверять
distance
междуplayer
иattachPoint
Если обновление
distance
меньше, чемmaxLength
обычно, то эффекты от веревки отсутствуют.Если расстояние больше, чем
maxLength
, найдитеnormal
отattachPoint
игрока к игроку. Получите разницу междуdistance
иmaxLength
. Добавьте кplayerVelocity
,normal
умноженному на разницу.Псевдокод:
источник
dx = player.x - attachpoint.x
иdy = player.y - attachpoint.y
.Если вы посмотрите на http://www.cocos2d-iphone.org/archives/1112, есть реализация веревки с жестким телом, прикрепленным к концу веревки. Он использует Box2D для физического движка. Если вы посмотрите на исходный код, я уверен, что вы сможете реализовать его на любом языке, который вам нравится.
Кроме того, приведенная выше ссылка на вопрос «Веревка» является моей, и приведенная выше демонстрация действительно помогла.
источник