2013-05-02 60 views
2

我的布娃娃基於托馬斯·雅各布森的文章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問題,所以請告訴我,如果我的表單不好。

回答

1

,我發現我的問題的根源是我計算的矢量之間的角度 一個非常好的解決這一問題可以在這裏找到了辦法: https://stackoverflow.com/a/21486462/2342801

使用這種方法來計算a1和a2擺脫的抖動 - 整個方法的問題是,verlet對衝突關節進行線性力施加,但是你想要的是通過旋轉傳遞到父關節的力(逆運動學)

因此,我會推薦一個不同的接近角度限制的二維布娃娃。