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組件截圖:- Force模式:
2.Impulse模式:
3.Velocity Change模式:- Force模式:
- Acceleration模式:
注意:要是通過力來控制物體,請不要再用Transform來控制物體的位置和移動
都看清楚題目,人家要的是剛體當前的詳細受力情況,並不是要求合力,碰撞時的衝量是可以獲得的。
不會影響開發的,除非你有非常具體的需求。通過腳本主動施加的力你可以自己記錄;而碰撞產生的力是瞬間作用的,可以通過碰撞事件獲得一些信息。綜合來看,基本需求都可以滿足了。力不是維持、而是改變物體運動狀態的原因。大概是因為這樣,他們覺得並不需要知道受力情況,而只需要知道運動狀態(速度、角速度)。
推薦閱讀:
※如何用unity做出磁體相互吸引和排斥的效果?
※為什麼手游現在普遍是996的工作了呢?
※有沒有人用Unity3D不是做遊戲而是做App的?
※無基礎製作獨立遊戲,應從哪裡入手?
※如何防止Unity3D代碼被反編譯?
TAG:Unity遊戲引擎 |