Unity3D剛體受力情況如何取得?

我想請教下各路大神,Unity有辦法取得物體的受力情況嗎?我看過API只有AddForce()的介面,沒有GetForce()的,比較困惑,我打算用Unity來進行些物理模擬,但不知道沒有GetForce()介面,會不會影響開發。


印像中是沒有 API 獲取合力的,因為合力是在做剛體模擬時才能根據約束求值。

你可以記錄剛體在兩幀的線性動量(質量乘以線性速度),它們的差除以幀時長,就是幀內的平均受力。


按照Milo Yip大大的思路寫了個腳本,在FixedUpdate(Unity文檔里寫著:, the FixedUpdate function is recommended as the place to apply forces and change Rigidbody settings)計算合力。

public class ForceTest : MonoBehaviour {

public const float FixedUpdateTimeStep = 0.02f;

private Vector3 previousVelocity, currentVelocity;

new Rigidbody rigidbody;

public Vector3 acceleration;

public Vector3 force;

public Vector3 addiingForce = new Vector3(0, 1, 0);

public ForceMode addingForceMode = ForceMode.Impulse;
void Start () {
rigidbody = GetComponent&();
}

void FixedUpdate () {

previousVelocity = currentVelocity;
currentVelocity = rigidbody.velocity;
acceleration = new Vector3((currentVelocity - previousVelocity).x / FixedUpdateTimeStep,
(currentVelocity - previousVelocity).y / FixedUpdateTimeStep,
(currentVelocity - previousVelocity).z / FixedUpdateTimeStep);
force = acceleration * rigidbody.mass;
rigidbody.AddForce(addiingForce, addingForceMode);
}
}

用一個Scale為1的Cube做實驗:發現ForceMode為Force或者Acceleration的時候是比較符合牛頓第幾定律F=ma的,但是始終有一點誤差,記錄如圖(默認還有-9.8的重力,所以合力應該是0):

Rigibody組件截圖:

  1. Force模式:

2.Impulse模式:

3.Velocity Change模式:

4.Acceleration模式:

添加其他方向力的情況:

  1. Force模式:

  2. Acceleration模式:

注意:要是通過力來控制物體,請不要再用Transform來控制物體的位置和移動


都看清楚題目,人家要的是剛體當前的詳細受力情況,並不是要求合力,碰撞時的衝量是可以獲得的。


不會影響開發的,除非你有非常具體的需求。

通過腳本主動施加的力你可以自己記錄;而碰撞產生的力是瞬間作用的,可以通過碰撞事件獲得一些信息。綜合來看,基本需求都可以滿足了。

力不是維持、而是改變物體運動狀態的原因。大概是因為這樣,他們覺得並不需要知道受力情況,而只需要知道運動狀態(速度、角速度)。


推薦閱讀:

如何用unity做出磁體相互吸引和排斥的效果?
為什麼手游現在普遍是996的工作了呢?
有沒有人用Unity3D不是做遊戲而是做App的?
無基礎製作獨立遊戲,應從哪裡入手?
如何防止Unity3D代碼被反編譯?

TAG:Unity遊戲引擎 |