2

Thomas Jakobsen の記事http://www.gpgstudy.com/gpgiki/GDC%202001%3A%20Advanced%20Character%20Physicsに基づいて、ラグドールに関する C# プロジェクトを行っています。

ロジックを 2D に変換しましたが、すべてが機能しているように見えますが、角度制約の実装に問題があります。

これは私が現在使用しているコードです:

public static void SatisfyAngleConstraint(Particle p1, Particle p, float minAngle, float maxAngle)
{
    float a1 = (float)Math.Atan2(p1.m_x.X - p1.getFixPoint().X, p1.m_x.Y - p1.getFixPoint().Y);
    float a2 = (float)Math.Atan2(p.m_x.X - p.getFixPoint().X, p.m_x.Y - p.getFixPoint().Y);
    float diffAngle = a2 - a1;
    Game.currentGame.Window.Title = "a " + diffAngle;
    //Vector2 OldPosition = p.m_x;
    if (diffAngle > maxAngle)
        p.m_x = RotatePoint(p.m_x, p.getFixPoint(), (diffAngle - maxAngle));
    else if (diffAngle < minAngle)
        p.m_x = RotatePoint(p.m_x, p.getFixPoint(), (diffAngle - minAngle));
    //p.m_oldx += p.m_x - OldPosition;
}

パーティクル p1 と p はジョイントで、getFixPoint() は親ジョイントの位置を返します。RotatePoint(point, centerPoint, angleRad) は、centerPoint を中心に angleRad ラジアンだけ回転したポイントの位置を返します。

このコードは深刻なジッターを引き起こします。私は Verlet 統合を使用しているため、変換を古い位置にも追加することでこれを補正しようとしましたが、これで問題の一部は解決したようですが、それでも深刻なジッターが発生し、私の数学が悪いと私に信じさせるランダムな力の適用。

親ジョイントを中心に回転している場合、ジョイント間の距離は一定でなければならないため、距離拘束の後にこの拘束を適用しています。

これは私の最初のスタックオーバーフローの質問です。私のフォームが悪いかどうか教えてください。

4

1 に答える 1

1

私の問題の根本は、ベクトル間の角度を計算する方法にあることがわかりました

この方法を使用して a1 と a2 を計算すると、ジッターが取り除かれます。このアプローチ全体の問題は、verlet が競合するジョイントに線形の力を適用することですが、必要なのは、回転によって親ジョイントに伝達される力です (逆運動学)。 )

したがって、角度の制約がある 2D ラグドールには別のアプローチをお勧めします。

于 2014-09-16T13:34:46.143 に答える