2

私は、直交する(体の方向に)力を加え、必要なトルクを生成することによって、体をそれ自体の中心の周りで回転させようとしています。しかし、これは(自然に)体も動かし、回転するだけで十分です。これが私のコードです。角度/方向を手動で設定するのではなく、この回転力を使用して設定しようとしていることに注意してください。

cpFloat dot = cpvdot(turningN, cpvnormalize_safe(cpBodyGetRot(body)));
cpFloat cross = cpvcross(turningN, cpvnormalize_safe(cpBodyGetRot(body)));


cpVect rotN;
if (cross<=0) {
    rotN = cpvperp(cpvnormalize_safe(cpBodyGetRot(body)));
}else{
    rotN = cpvrperp(cpvnormalize_safe(cpBodyGetRot(body)));
}

cpVect rotF = cpvmult(rotN, 300*(1-dot));
cpBodyApplyForce(body, rotF, cpv(75,14));

turningN体が持つべき方向を決定するベクトルです。体の方向が目的の方向に向かうにつれて、回転が少なくなるように内積を作成します。

編集

したがって、@ DGHが指摘しているように、同じ方向と大きさの力を追加する必要がありますが、回転力とは反対で、オブジェクトの中心に向かっています。したがって、これを機能させるには、次のコード行を追加するだけで済みます。

cpBodyApplyForce(body, cpvneg(rotF), cpvzero);

4

1 に答える 1

5

シマリスはわかりませんが、物理学は少し知っています。オブジェクトの中心に反対方向に2番目の力を加え、その大きさを適切にスケーリングして、望ましくない動きに対抗します。

これは、静止した車軸に取り付けられたホイールを持っているようなものです。ホイールの端に力を加えると、車軸が反対方向に反動力を加えるため、前に移動せずに回転します。

于 2012-08-17T20:20:09.767 に答える