2012-07-14 18 views
2

所以我無法讓我的砂金面臨一個星球。我有球員和地球之間的角度,我也有球員目前的角度,現在我想要做的就是讓我的球員面對這個星球,但卻有一個漸進的變化。 (我這樣做是因爲我希望我的砂金能夠繞地球軌道運行)旋轉玩家面對行星

問題在於數學,我增加了玩家的旋轉角度來匹配玩家和行星之間的角度,但是因爲角度在0到360我的球員不會繞行,因爲球員的旋轉角度可能是2°但是對角球的角度是280,所以遊戲會讓玩家轉過身來,對於糟糕的解釋抱歉。

有誰知道如何讓我的玩家成功繞行我的星球?

這裏是我的代碼:

double rotation = Math.toDegrees(Math.atan2(currentPlanet.pos[1]-currentPlayer.pos[1], currentPlanet.pos[0]-currentPlayer.pos[0])); 
if(rotation < 0) 
{ 
    rotation += 360; 
} 

if(currentPlayer.rotation < rotation) 
{ 
    currentPlayer.rotation += 0.15*delta; 
} 

if(currentPlayer.rotation > rotation) 
{ 
    currentPlayer.rotation -= 0.15*delta; 
} 

回答

2

問題是350°也是-10°。你想要更小的絕對值。

解決方案非常簡單。使用模運算將角度轉換爲正確的範圍。

/* returns angle x represented in range -180.0 ... 180.0 */ 
double clampAngle(double x) { 
    return (x%360.0+360.0+180.0)%360.0-180.0; 
} 

將您的角度差異傳遞給此函數。結果的標誌會告訴你在哪個方向,你應該把:

double rotation = Math.toDegrees(Math.atan2(currentPlanet.pos[1]-currentPlayer.pos[1], currentPlanet.pos[0]-currentPlayer.pos[0])); 
double diff = ((rotation-currentPlayer.rotation)%360.0+360.0+180.0)%360.0-180.0; 

if(diff>0) 
    turn right 
else 
    turn left 

您可能要根本轉向,如果abs(diff)是非常小的。

我不確定它是否會讓你的玩家繞着你的星球運行。您需要設置正確的角速度和線速度。

+0

我將如何去實現這個? – 2012-07-14 19:30:23

+0

這是我的玩家只能用一個方向旋轉,但它會繞着方向旋轉,有沒有理由不去左邊? – 2012-07-15 10:49:59

+0

@Luke嘗試編輯的代碼。以前的版本可能會給出負面角度的錯誤結果。 – 2012-07-16 17:04:49

1

你想要的是讓你的播放器旋轉到面向正負90度你計算出地球和玩家之間的夾角。當所有運動都與地球相切(90度)時,就會發生軌道運動。

因此,計算角度,將玩家角度與+90和-90進行比較,然後朝着兩者中較接近的角度旋轉玩家。