Создание неопределенно колеблющегося маятника в Farseer Physics 3.3.1 / Box2d

Я новичок в Farseer Physics и использую версию 3.3.1. Мне нужна помощь, и я даже был бы рад получить ответы Box2d, чтобы убедиться, что я получу ответ, поскольку тогда я смогу его преобразовать! - Спасибо

... После долгой работы мне удалось создать тонкий вертикальный прямоугольник на экране, и я хочу, чтобы он качался вперед и назад, закрепленный наверху, до установленного мной угла (90 градусов было бы хорошо для этого образца ).

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

Это код, который у меня есть до сих пор, который качает фигуру, но кажется, что он теряет скорость при каждом замахе, в конечном итоге останавливаясь:

float playerWidth = ConvertUnits.ToSimUnits(5), playerHeight = ConvertUnits.ToSimUnits(68);
playerPosition = ConvertUnits.ToSimUnits(-350, 0);
playerBody = BodyFactory.CreateRectangle(World, playerWidth, playerHeight, 2f, playerPosition);
playerBody.BodyType = BodyType.Dynamic;
// create player sprite based on player body
_rectangleSprite = new Sprite(ScreenManager.Assets.TextureFromShape(playerBody.FixtureList[0].Shape, MaterialType.Player, Color.Orange, 1f));
// Create swinging joint
var joint = JointFactory.CreateFixedRevoluteJoint(World, playerBody, ConvertUnits.ToSimUnits(0, -34), playerBody.Position);

Если бы кто-то мог также предоставить команду, мне нужно было бы приостановить фигуру щелчком мыши или командой клавиатуры под текущим углом, а затем продолжить, когда я отпущу щелчок мыши, что было бы супер фантастически!

Ваше здоровье


person GONeale    schedule 15.04.2012    source источник
comment
Пожалуйста, не делайте перекрестных сообщений на SE.   -  person    schedule 16.04.2012


Ответы (2)


Обычно раскачивание тела в этой ситуации занимает очень много времени, чтобы остановиться (на самом деле у нас есть вопросы, иногда спрашивающие, как его остановить ...), поэтому я предполагаю, что длинная тонкая форма могла бы играть роль часть. Как и другие физические движки, Box2D имеет проблемы с длинными тонкими формами.

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

Но нужно ли этому маятнику сталкиваться с другими объектами? Это могло бы выглядеть странно, если бы он поднял более тяжелый объект, но не замедлился, или он замедлился до тех пор, пока не достиг точки, в которой вы увеличили скорость, а затем внезапно стал быстрее. Если ему не нужно реагировать динамически, вам может быть лучше с кинематическим телом, которым вы управляете сами, устанавливая соответствующую угловую скорость в каждом кадре.

Кинематическое тело также упростило бы последнюю часть вашего вопроса, потому что вы могли бы просто установить скорость на ноль, пока вы не будете готовы, чтобы он снова начал двигаться. Чтобы получить этот эффект с динамической настройкой тела / сустава, вам нужно будет записать текущую линейную и угловую скорость, затем отменить гравитацию для тела в каждом кадре, пока оно не должно двигаться, а затем восстановить скорости, чтобы сохранить их. снова движется. Но если что-нибудь за это время ударит, этот трюк не удастся. Вы также можете временно установить пределы сустава (нижний / верхний) на один и тот же угол, чтобы заставить сустав удерживать маятник неподвижно, но я действительно сомневаюсь, что тело размером 5x68 будет хорошо работать с этими ограничениями.

person iforce2d    schedule 15.04.2012
comment
Привет, спасибо за подробный ответ, маятник никогда не столкнется с другими объектами, поэтому подойдут любые хитрости :) Однако он потенциально разъединит шарнир, свободное падение, а затем снова установит штифт / поворотное соединение на одном конце на другом место в мире. Видя, что я новичок, я понимаю теорию того, о чем вы говорите, но вы могли бы предоставить более подробную информацию о кодировании, чтобы я начал? Вы предлагаете, чтобы я по-прежнему использовал Farseer для выполнения этой задачи? Как мне записывать скорости и отменять гравитацию в каждом кадре? - person GONeale; 15.04.2012

Любая не специально построенная симуляция маятника, вероятно, со временем потеряет энергию.

Если вам нужен маятник для взаимодействия с другими физическими объектами, оставьте то, что у вас есть сейчас, но по мере выполнения моделирования отрегулируйте его, чтобы он продолжал работать; например, каждый раз, когда он движется по вертикали, масштабируйте линейную и угловую скорость до той же величины, что и в первый раз (если он, например, не ударил что-то, и в этом случае он не должен продолжать движение как это).

Если вам не нужно, чтобы он ни с чем взаимодействовал, или он не должен реагировать, а только толкать другие объекты, то не делайте его смоделированным твердым телом; вместо этого просто анимируйте его (задав угол) на основе текущего времени. В вашем физическом движке, вероятно, есть опция для объектов, которые перемещаются, но сами не перемещаются другими телами, и, вероятно, это свойство BodyType. (У меня нет навскидку формулы для определения положения маятника во времени, но я уверен, что она где-то есть.)


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

person Kevin Reid    schedule 15.04.2012