0

私は、アームが回転ジョイントでボディに接続されている静止ボディ上の box2d アーム (上腕、前腕、および手) で構成される単純な box2d 構成であると思います。目的は、腕が前方に動いたときに手の中の物体を解放できるように、腕を後ろに引くことです (つまり、アンダースロー)。脇の下の動きで腕をアシストするモーターを有効にしました。

問題は、腕で有効にした制限を超えない現実的な腕の速度を有効にするパラメーター値を考え出すことができないことです。maxMotorTorque を小さい値 (たとえば、3.0 未満の任意の数値) に設定すると、アームは反時計回りに回転し、設定した制限で停止しません。モーター速度を 5.0 ~ 15000.0 ラジアン/秒の範囲に設定すると、maxMotorTorque を 4.0 に設定してもアーム速度は変化しません。maxMotorTorque を小さな値に減らすと、アームは飛び回りますが、やはり限界を超えてしまいます。

以下は、回転ジョイントを初期化するために使用するコードです。

// Create a Revolute Joint at the shoulder
b2RevoluteJointDef revJointDef;
revJointDef.Initialize(body, upperArmBody,
                       upperArmBody->GetWorldPoint(b2Vec2(0, 15.0/100.0)));

revJointDef.enableLimit = true;
revJointDef.lowerAngle = CC_DEGREES_TO_RADIANS(-45);
revJointDef.upperAngle = CC_DEGREES_TO_RADIANS(20); 

revJointDef.enableMotor = true;
revJointDef.motorSpeed = 15000.0;
revJointDef.maxMotorTorque = 4.0;

shoulderJoint = (b2RevoluteJoint*)world->CreateJoint(&revJointDef);

腕の密度は 0.5、手のオブジェクトの密度は 1.0 です。これらの密度を下げると、腕をより速く動かすことができますが、やはり限界を超えてしまいます.

私が間違っていることについてのアイデアはありますか? 限界を超えずに腕を速く動かすにはどうすればよいですか?

4

1 に答える 1