布娃娃关节角度的限制

时间:2013-05-02 11:17:53

标签: c# math constraints angle verlet-integration

我根据Thomas Jakobsen的文章http://www.gpgstudy.com/gpgiki/GDC%202001%3A%20Advanced%20Character%20Physics

在ragdolls上做一个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)返回以centerRad弧度为中心旋转的点的位置。

此代码导致严重的紧张情绪,并且由于我使用Verlet集成 - 我试图通过将转换添加到旧位置来弥补这一点,这似乎解决了我的一些问题,但我仍然经历严重的紧张和随意的力量应用让我相信我的数学很糟糕。

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

这是我的第一个stackoverflow问题,所以请告诉我表格是否错误。

1 个答案:

答案 0 :(得分:1)

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

使用此方法计算a1和a2摆脱了抖动 - 这整个方法的问题是,verlet对冲突的关节进行线性力应用,但你想要的是通过旋转传递给父关节的力(反向运动学)

因此,我建议采用不同的方法来处理角度约束的2D抹布娃娃。

相关问题