box2d дрожит, когда тело намагничено - PullRequest
3 голосов
/ 17 октября 2011

Итак, у меня есть некоторые тела (которые я могу создавать все больше и больше во время выполнения), и мне нужно, чтобы они были намагничены к центру экрана.Пусть это будет (480/2 / WORLD_SCALE, 320/2 / WORLD_SCALE) в мировом пространстве.Я новичок в box2d, так что, возможно, есть простой способ добиться этого, но я пытаюсь сделать это следующим образом:

  1. Я вычитаю положение каждого тела и центральную позицию экрана - чтобы получить направление ккуда мне нужно переместить мое тело.
  2. Нормализовать вектор направления (который я нашел на стр.1)
  3. Умножить этот нормализованный вектор на мое значение силы тяжести
  4. Добавьте вектор (который я получил на стр. 3) к текущей скорости тела

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

Если бы у меня было только одно тело, я бы не выполнил шаги 2,3, когда телоближе к центру экрана, чем размер гравитации.Но я не могу связать положение тела с центром магнитного поля, потому что эти два тела никогда не будут занимать точно среднее место на экране, поскольку они будут сталкиваться друг с другом.Поэтому я не могу сделать свой гравитационный вектор переменным, и игра с любыми трениями не поможет, может быть, поможет какой-то пошаговый взлом, но я думаю, что мне нужно реализовать какую-то подпрыгивающую противодействующую силу или что-то в этом роде.

Я новичок в box2d и не очень хорошо разбираюсь в физике.

Что также может быть важно, так это то, что я установил скорость тела с помощью метода SetLinearVelocity.

Может быть, яЯ просто что-то упустил, может быть, есть какой-то родной способ для box2d добиться этого.Любая помощь приветствуется.

1 Ответ

2 голосов
/ 18 октября 2011

Решил эту проблему, изменив мировой масштаб. «Box2D также использует неупругие столкновения, когда скорость столкновения мала. Это сделано для предотвращения дрожания». http://www.box2d.org/manual.html Прочитав это, я понял, что должен сделать свой вектор ускорения достаточно маленьким, чтобы box2d использовал эти неупругие столкновения и предотвращал его дрожание "родным" способом. Таким образом, увеличение WORLD_SCALE в 4 раза сделало расстояния между телами и центром экрана достаточно большими. Игра с новыми числами для гравитации и силы трения сделала свое дело.

С уважением, Игорь

...