关于C#:Ragdoll关节angular约束

Ragdoll joint angle constraints

我正在根据托马斯·雅各布森的文章http://www.gpgstudy.com/gpgiki/GDC 2001:高级角色物理<

我已将逻辑转换为2D,并且似乎只有在实现angular约束时遇到问题,一切都可以正常工作。

这是我目前正在使用的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
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)返回以angleRad弧度为中心围绕中心点旋转的点的位置。

此代码会引起严重的抖动,并且由于我使用Verlet集成-我也尝试通过将转换添加到旧位置来补偿此问题,这似乎确实解决了我的一些问题,但我仍然会遇到严重的抖动和随机施加的力使我相信我的数学是错误的。

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

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


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

使用此方法来计算a1和a2可以消除抖动-整个方法的问题是Verlet会对冲突的关节施加线性力,但您想要的是通过旋转力将力传递给父关节(反向运动学)

因此,我建议对angular受限的2D布娃娃使用不同的方法。