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 集成这一事实 - 我试图通过将转换添加到旧位置来弥补这一点,这似乎解决了我的一些问题,但我仍然遇到严重的抖动和随机力应用让我相信我的数学很糟糕。

我在距离约束之后应用此约束,因为当我围绕父关节旋转时,关节之间的距离应该是恒定的。

这是我的第一个 stackoverflow 问题,所以请告诉我我的表单是否不好。

4

1 回答 1

1

我发现我的问题的根源在于我计算向量之间的角度的方式一个非常好的解决这个问题的方法可以在这里找到: https ://stackoverflow.com/a/21486462/2342801

使用这种方法计算 a1 和 a2 消除了抖动 - 整个方法的问题是 verlet 对冲突关节施加线性力,但您想要的是通过旋转传递到父关节的力(反向运动学)

因此,我建议对具有角度约束的 2D 布娃娃采用不同的方法。

于 2014-09-16T13:34:46.143 回答