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 統合を使用しているため、変換を古い位置にも追加することでこれを補正しようとしましたが、これで問題の一部は解決したようですが、それでも深刻なジッターが発生し、私の数学が悪いと私に信じさせるランダムな力の適用。
親ジョイントを中心に回転している場合、ジョイント間の距離は一定でなければならないため、距離拘束の後にこの拘束を適用しています。
これは私の最初のスタックオーバーフローの質問です。私のフォームが悪いかどうか教えてください。