2012-04-15 2 views
1

Я новичок в 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); 

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

Приветствия

+1

Пожалуйста, не перекрестие на SE. – Will

ответ

1

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

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

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

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

+0

Эй, спасибо за подробный ответ, нет, маятник никогда не столкнется с другими объектами, поэтому любые обманщики сделают :) Это, однако, потенциально отключит его совместное, свободное падение, а затем снова восстановит штырь/револьверный сустав на одном конце разное место в мире. Видя, что я очень новичок, я понимаю теорию того, что вы говорите, но более подробно вы могли бы предоставить кодирование мудрым, чтобы начать меня? Вы предлагаете мне использовать Farseer для выполнения этой части? Как сделать заметки о скоростях и отменить гравитацию в каждом кадре? – GONeale

1

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

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

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


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

Смежные вопросы