2016-12-14 69 views
1

我無論如何都不是物理學專家,因此我無法確切地告訴我所尋找的效果如何。我只是把它稱爲「下旋」現在:)Unity3d:帶有剛體的球體後旋體

圖片這樣的場景:

有在一張乒乓球桌的你面前一個乒乓球。你用手指在它上面施加壓力(用很大的力量從球的頂部到底部)。乒乓球會從你的手指向前滑動但是向後旋轉。所以,儘管它已經向前移動時它最終會退回給你,因爲它向後旋轉:d

我希望是有道理的。我真的不知道這種效應是如何被調用的,所以我不能真正查找解決方案。

我確實有一個簡單的平面上有一個球體(剛體連接)。我想通過在屏幕上滑動來模擬這種確切的效果。但最重要的是,如何實現這一效果?效果也應該通過確切地將壓力放在球的位置(左側或右側)來實現。我只是希望它在向後旋轉時向前移動,並且由於其反向力而最終回滾(不完全相同,但更現實)。

我已經嘗試過使用Addforce和Addtorque,但沒有成功。

任何幫助,高度讚賞。

祝您有美好的一天!

編輯:我有什麼至今:

public float spin = 1000f; 
public float force = 20f; 
public float angularVelocity = 100f; 
private Rigidbody rb; 
private Vector3 oldPos; 
private Quaternion oldRot; 
public int pressed = 0; 

void Start() { 
    oldPos = transform.position; 
    oldRot = transform.rotation; 
    rb = GetComponent<Rigidbody>(); 
    rb.maxAngularVelocity = angularVelocity; 
} 

void FixedUpdate() 
{ 
    Debug.Log(rb.velocity.magnitude); 

    if (Input.GetKey(KeyCode.Space)) 
    { 
     Debug.Log("pressed"); 
     pressed = 1; 
     rb.AddForce(new Vector3(0,0,force),ForceMode.VelocityChange); 
     rb.AddTorque (new Vector3 (-spin, 0, 0), ForceMode.Force); 
    } 
} 

EDIT2:

public float spin = 1000f; 
public float force = 20f; 
public float angularVelocity = 100f; 
private Rigidbody rb; 
private Vector3 oldPos; 
private Quaternion oldRot; 
public int pressed = 0; 
public float forceTime = 1f; 
public float startBack = 0.25f; 

void Start() { 
    oldPos = transform.position; 
    oldRot = transform.rotation; 
    rb = GetComponent<Rigidbody>(); 
    rb.maxAngularVelocity = angularVelocity; 
} 

void FixedUpdate() 
{ 
    Debug.Log(rb.velocity.magnitude); 
    if (pressed == 2) 
    { 
     rb.AddForce(new Vector3(0,0,-force),ForceMode.Acceleration); 

    } 
    else if (pressed == 1 && rb.velocity.magnitude <= startBack && rb.velocity.magnitude >= 0f) 
    { 
     pressed = 2; 
     StartCoroutine("StopForce"); 
    } 
    else if (Input.GetKeyDown(KeyCode.Space) && pressed == 0) 
    { 
     Debug.Log("pressed"); 
     rb.AddForce(new Vector3(0,0,force),ForceMode.VelocityChange); 
     rb.AddTorque (new Vector3 (-spin, 0, 0), ForceMode.Force); 
     pressed = 1; 
    } 
} 
IEnumerator StopForce() { 
    yield return new WaitForSeconds(forceTime); 
    pressed = 3; 
} 
+1

添加你能不能負旋轉量添加到遊戲對象,並使用添加力向前移動。你也可以添加一個物理材質,它會影響它與表面的反應方式。這可能會幫助你 http://answers.unity3d.com/questions/377944/how-to-make-a-ball-rotate-as-per-its-moving-direct.html] –

回答

1

啓動一個新項目。添加地形和球體。在球體上添加一個剛體,並將Drag改爲1.將球設置在中間的地形頂部。將此代碼添加到您的球體中游戲對象

Rigidbody rb; 

void Start() { 
    rb = GetComponent<Rigidbody>(); 
    rb.maxAngularVelocity = 100; 
    rb.AddForce(new Vector3(20,0,0),ForceMode.VelocityChange); 
    rb.AddTorque (new Vector3 (0, 0, 1000), ForceMode.Force); 
} 

Viola。請注意,該代碼放置在start方法,而不是更新,因爲力不應該持續

+0

嘿,謝謝!我越來越近了。我用迄今爲止的代碼更新了我的問題。我稍微改變了你的代碼。球體現在向前移動並最終返回。但是:它似乎像在冰上一樣,就像真的很快倒退,但是移動速度很慢,這很好,但是我希望它有更多的摩擦力,因此速度更快。任何想法如何實現? – user2669261

+0

右鍵單擊項目窗口中的空白區域,並創建一個新的物理材質。改變摩擦值更高。數字越高,它的抓地力就越大,不會遠行。將它添加到你的球體和地形對撞機 –

+0

嘿。謝謝。我對物理材料並不是很滿意,於是我想出了另一種方法(在主文章中編輯):一旦spere達到magnitude = 0,我就設置另一個Addforce。看起來就像我想要的那樣。謝謝你的幫助! – user2669261