2016-09-18 47 views
1

我需要計算角度,通過球在該方向上給定的速度和投擲後應該着陸的點。如何計算投影在3D中的角度以在給定點步進的物體?

水平角度很容易(我們知道開始點和步驟點)。如何計算投影的垂直角度。有物體上應用肉汁。

旅行時間通常爲保齡球時間(球釋放時間和發生步數之間的時間)。

在unity3d中有直接的方法嗎?

觀看this視頻持續8秒,以清楚地理解此問題。

回答

1

根據維基百科頁面Trajectory of a projectile,該 「範圍的角度」(你想知道的角度)的計算方法如下:

θ= 1/2 * ARCSIN(GD /V²)

在這個公式中,g是引力常數9.81,d是你想讓彈丸傳播的距離,v是物體投擲的速度。

代碼來計算,這可能是這個樣子:

float ThrowAngle(Vector3 destination, float velocity) 
{ 
    const float g = 9.81f; 
    float distance = Vector3.Distance(transform.position, destination); 
    //assuming you want degrees, otherwise just drop the Rad2Deg. 
    return Mathf.Rad2Deg * (0.5f * Asin((g*distance)/Mathf.Pow(velocity, 2f))); 
} 

這會給你假設沒有空氣阻力等,存在於你的遊戲的角度。 如果您的目的地和您的「投擲點」不在同一高度,您可能需要先設置y = 0,否則可能會發生錯誤。

編輯:

考慮到你的啓動點了比目標更高,在同一頁面這個公式應該工作:

θ=反正切(V²(+/-)√(V^g(gx 2 + 2yv 2))/ gx)

這裏,x是距離或距離,y是高度(相對於發射點)。

代碼:

float ThrowAngle(Vector3 start, Vector3 destination, float v) 
    { 
     const float g = 9.81f; 
     float xzd = Mathf.Sqrt(Mathf.Pow(destination.x - start.x, 2) + Mathf.Pow(destination.z - start.z, 2)); 
     float yd = destination.y - start.y; 
     //assuming you want degrees, otherwise just drop the Rad2Deg. Split into two lines for better readability. 
     float sqrt = (Mathf.Pow(v,4) - g * (g*Mathf.Pow(xzd,2) + 2*yd*Mathf.Pow(v,2))/g*xzd); 
     //you could also implement a solution which uses both values in some way, but I left that out for simplicity. 
     return Mathf.Atan(Mathf.Pow(v, 2) + sqrt); 
    } 
+0

沒有既不能以相同的高度。投影在某個高度開始,目標點在地面上,如視頻中所示,與保齡球(球移動)相同。 – djkp

+0

該文章有一部分不是從y = 0開始,而是有y = 0的着陸點。(你可以把最低點看作y = 0,我想如果實際上沒有一個是y = 0)。只需看右邊的圖形即可找到正確的公式。 –

+0

正在撰寫答案。請給我一點時間。 –