我正在根据 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 集成这一事实 - 我试图通过将转换添加到旧位置来弥补这一点,这似乎解决了我的一些问题,但我仍然遇到严重的抖动和随机力应用让我相信我的数学很糟糕。
我在距离约束之后应用此约束,因为当我围绕父关节旋转时,关节之间的距离应该是恒定的。
这是我的第一个 stackoverflow 问题,所以请告诉我我的表单是否不好。