установка угла шарнира b2revolutejoint

Из того, что я читал, в Box2d вы получаете угол поворотного соединения с помощью функции GetJointAngle, но при попытке установить угол элемент m_referenceAngle защищен. Угол программно нельзя задать?

Я обнаружил, что могу применить угол от одного сустава к другому телу как:

float FirstAngle = firstArmJoint->GetJointAngle(); secondArmBody->SetTransform(b2Vec2((750.0/PTM_RATIO),(520.0f+100)/PTM_RATIO),hourAngle);

Я поместил это в ccTouchesMoved, чтобы когда пользователь перетаскивал первый объект (из которого извлекается FirstAngle), второй объект (secondArmBody) также перемещался.

Что происходит, так это то, что второе тело вращается в верхней части изображения, а не в точке привязки.

Любые идеи?


person greensborolion    schedule 28.07.2012    source источник
comment
Я обнаружил, что могу применить угол к телу B2, с которым связан сустав, следующим образом:   -  person greensborolion    schedule 28.07.2012


Ответы (1)


SetTransform() можно использовать для установки положения и поворота тела. Это происходит совершенно независимо от каких-либо суставов на теле. Например, если вы хотите убедиться, что тело в данный момент находится в вертикальном положении, вы можете вызвать

body->SetTransForm(body->GetPosition(), 0);

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

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

Создание соединения

b2RevoluteJointDef armJointDef;
armJointDef.Initialize(body1, body2,
    b2Vec2(body1->GetPosition().x,
    ((body1->GetPosition().y/PTM_RATIO));
armJointDef.enableMotor = true;
armJointDef.enableLimit = true;
armJointDef.motorSpeed = 0.0f;
armJointDef.maxMotorTorque = 10000.0f;
armJointDef.lowerAngle = CC_DEGREES_TO_RADIANS(lowerArmAngle);
armJointDef.upperAngle = CC_DEGREES_TO_RADIANS(upperArmAngle);
_world->CreateJoint(&armJointDef);

Указывая на сустав

float targetAngle = SOME_ANGLE;
b2JointEdge *j = body->GetJointList();
b2RevoluteJoint *r = (b2RevoluteJoint *)j->joint;
if(r->GetAngle() > targetAngle){
    r->SetMotorSpeed(-1);
} else { r->SetMotorSpeed(1); }

По сути, вы видите, с какой стороны от текущего угла находится целевой угол, а затем устанавливаете скорость двигателя для перемещения сустава в правильном направлении. Надеюсь, это поможет!

http://www.box2d.org/manual.html

person Emmett Butler    schedule 28.07.2012
comment
да, я могу использовать это (указать сустав), чтобы переместить второй объект в направлении, в котором я перемещаю первый объект, но это просто заставляет объект вращаться в этом направлении и не соответствует скорости или перестает вращаться, когда я отпускаю первый объект - person greensborolion; 28.07.2012