2015-01-16 47 views
2

我新的團結,我想創建一個反彈球,所以我做了很多研究,關於反彈realted物理學和我發現了一個公式:2D彈跳公式不能正常工作

公式:

-2*(V dot N)*N + V 

其中,V是速度矢量,N是正常上,球會反彈

這裏表面是我的腳本:

using UnityEngine; 

using System.Collections; 

public class BallPhysics : MonoBehaviour { 



    void Start() { 
     rigidbody2D.velocity =new Vector2 (-1,-3); 

    } 

    // Update is called once per frame 
    void Update() { 

    } 
    void OnTriggerEnter2D(Collider2D col) { 

     if (col.gameObject.name == "Pong") { 
      tBounce(); 
       } 


    } 

    void tBounce(){ 
     RaycastHit2D hit = Physics2D.Raycast (new Vector2 (transform.position.x,transform.position.y), new Vector2(-1f,-1f)); 
     Vector2 n = hit.normal; 
     Vector2 v = rigidbody2D.velocity; 
     Vector2 R = -2 * (Vector2.Dot (v, n)) * n + v; 
     rigidbody2D.velocity = R; 
    } 
} 

我在起始函數中給出了一個速度矢量,我使用OnTriggerEnter2D進行碰撞處理,並使用raycast2D來獲取曲面的法線。

問題是腳本不能反映稱爲R的速度矢量,我認爲問題是在法向量中。例如,假設V是一個Vector2(-1,-1),所以基本上R應該是(-1,1),但它不是。 R是(3,1)!

我已經成功地通過顛倒球的速度在水平/垂直表面上彈起一個彈跳球,但是這對於任意角度都不能正常工作,這就是爲什麼我使用這個公式。 那麼問題是什麼?

+0

爲什麼不使用物理材料並將反彈設置爲1? – JRowan

+0

我並沒有使用這種方法,因爲球會在一個位置發球,我不希望它如此逼真。 – DeltaWeb

+1

這就是酷,我只是想知道我看了看這個問題,並即時通訊感興趣,我不知道該怎麼告訴你,我只是說,我會用一個物理材料,好運:) – JRowan

回答

1

您的raycast可能會碰撞錯誤的對撞機。你從transform.position開始。這是你的球對象的中心點。

想象一下射線從一個圓的中心出來。它命中的第一行是什麼?它首先擊中圓圈。所以你的Raycast報告球的表面正常,而不是乒乓球拍。

有很多方法可以解決這個問題。您可以應用忽略光線投射的Physics Layer。我認爲有一個這樣的預先定義。您也可以創建自定義的圖層,併爲您的raycast提供圖層蒙版。

還有其他方法可以解決它,比如從其他地方發起的raycast,但由於您在對象碰撞時這樣做,所以圖層蒙版可能是最簡單的。

+0

感謝的是工作 – DeltaWeb