worldAnchor0nBody2);
jointDef.collideConnected = true;
7.2.2. Болтовоесоединение
Болтовое соединение можно представить, как будто в определенной точке мы просверлили отверстие через оба тела и вставили в него болт, вокруг которого они могут вращаться. Эту точку часто называют шарнирной точкой . Болтовое соединение имеет одну степень свободы: угол поворота второго тела относительно первого. Этот угол называется угол соединения .
^"^ \body2
anchor \f*\^^"^
yr \ body I
Для создания болтового соединения необходимо предоставить два тела и указать якорную точку в мировых координатах. Функция инициализации предполагает что тела уже находятся в правильном положении.
В этом примере, два тела связываются болтовым соединением в точке центра масс первого тела.
b2RevoluteJointDef jointDef; jointDef.Initialize(myBodyl, myBody2, myBodyl->GetWorldCenter());
Угол болтового соединения положителен, когда body2 поворачивается против часовой стрелки относительно bodyl. Подобно всем другим углам в Box2D, угол болтового
соединения измеряется в радианах. По умолчанию, угол болтового соединения после создания равен нулю, независимо от текущих углов поворота тел. Иногда требуется контролировать угол соединения. Для этого, болтовое соединение может моделировать ограничение и/или мускул. Ограничение соединения заставляет угол болтового соединения находиться в определенных пределах. При выходе угла болтового соединения за пределы к телам применяется момент для возврата угла в правильное положение. Поэтому верхний или нижний предел угла соединения должен включать ноль, иначе при начале моделирования будет заметен резкий рывок тел. Мускул позволяет указать скорость соединения (производную угла по времени). Скорость может быть положительной или отрицательной. Мускул может иметь бесконечную силу, но это не желательно. Может вы когда-нибудь слышали такое:
Внимание
"Что произойдет, когда непреодолимая сила встретит непоколебимый объект?"
Могу сказать что ничего хорошего. Можно задать максимальный вращающий момент для мускула. Мускул будет поддерживать заданную скорость, пока необходимый для этого вращающий момент не превысит определённого максимума. При превышении максимума, вращение соединения будет приостановлено и может продолжиться в другом направлении. Можно использовать мускул для моделирования трения в соединении. Надо только установить скорость соединения в ноль, а максимальный вращающий момент сделать небольшой, но не нулевой величиной. Мускул будет пытаться предотвратить вращение соединения, но не будет способен противостоять значительной нагрузке.
Вот пример использования болтового соединения с учетом рассмотренных выше понятий; на этот раз соединение имеет предел и мускул. Мускул настроен на моделирование трения соединения.
b2RevoluteJointDef jointDef;
jointDef.Initialize(bodyl, body2, myBodyl->GetWorldCenter()); jointDef.lowerAngle = -0.5f * b2_pi; // -90 градусов jointDef.upperAngle = 0.25f * b2_pi; // 45 градусов jointDef.enableLimit = true; jointDef.maxMotorTorque = 10.Of; jointDef.motorSpeed = O.Of; jointDef.enableMotor = true;
7.2.3. Призматическоесоединение
Призматическое соединение позволяет телам перемещаться лишь относительно определенной оси (заданной относительно тел) и не допускает вращения этих тел. Поэтому, призматическое соединение имеет одну степень свободы: перемещение второго тела относительно первого.
Определение призматического соединения подобно описанию болтового соединения; только заменяет угол перемещением, а момент силой. По аналогии с болтовым соединением, определение призматического соединения с ограничениями и мускулом
myBody2, myBodyl->GetWorldCenter(
-5.0f; 2.5f;
будет иметь вид:
b2PrismaticJointDef jointDef; b2Vec2 worldAxis(1.Of, O.Of); j ointDef.Initialize(myBodyl, worldAxis);
jointDef.lowerTranslation = jointDef.upperTranslation = jointDef.enableLimit = true; jointDef.motorForce = l.Of; jointDef.motorSpeed = O.Of; jointDef.enableMotor = true;
Болтовое соединение имеет неявно задаваемую ось (которая перпендикулярна экрану, поэтому не может быть отображена) вокруг которой тела могут вращаться. Для призматического соединения необходимо явно указать ось лежащую в плоскости экрана. Эта ось сохраняет своё положение относительно тел и перемещается вместе с ними.
Подобно болтовому соединению, перемещение призматического соединения равно нулю при создании соединения (вызов метода Initialize()). Поэтому необходимо чтобы верхний или нижний предел был равен нулю.
7.2.4. Талевое соединение
Талевые соединения используются для создания идеальных талей. Тали соединяют два тела с землей и друг с другом. Общая длина двух сегментов талей фиксирована и удовлетворяет следующему уравнению.
lengthl + length2 == constant
ground 1
length I
anchor]
ground2
lengths
. апсппг2
Вы можете использовать коэффициент, чтобы смоделировать "блоки и тали". Это может быть нужно, если вы хотите чтобы одна из сторон тали удлинялась быстрее чем другая. Иногда ограничивающая сила на одной стороне слабее чем на другой. Вы можете воспользоваться этим и реализовать механические рычаги.