我的布娃娃基於托馬斯·雅各布森的文章http://www.gpgstudy.com/gpgiki/GDC%202001%3A%20Advanced%20Character%20Physics布娃娃關節角度約束
我已經轉換的邏輯,以2D,一切都做一個C#項目似乎是工作只有我有實現的角度限制問題。
這是我使用的時刻的代碼:
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弧度返回以centerPoint爲中心旋轉的點的位置。
此代碼會導致嚴重的抖動,並且由於我使用Verlet集成這一事實 - 我試圖通過向舊位置添加轉換來彌補這一點,並且這似乎解決了我的一些問題,但我仍然經歷嚴重的抖動和隨機的力量應用,這使我相信我的數學不好。
我在距離約束之後應用這個約束,因爲當我圍繞父關節旋轉時,關節之間的距離應該是恆定的。
這是我的第一個stackoverflow問題,所以請告訴我,如果我的表單不好。