關於Unity中的剛體和碰撞器的相關用法(一)


1.創建一個3D工程

2.構造項目文件目錄

3.保存場景為game_scene到文件夾scenes中

4.創建一個Plane平面類型的GameObject節點和一個Sphere球體類型的GameObject節點

5.給Plane貼上圖片,Sphere貼上材質,可以設置球的材質的Shader為Mobile/Diffuse

6.運行,發現球在空中靜止,因為沒有添加受力體,也就是剛體組件Rigidbody,添加后運行,球從空中掉到平面上,前提是兩者都已經有Collider碰撞器組件,否則只要一方沒有Collider就會穿過彼此。

 

Rigidbody組件屬性

1.Mass(質量): [0, 10],默認為1, [0.1, 10]日常生活的感受;

2.Drag(阻力): 物體移動時的阻力
3.AngularDrag(旋轉阻力): 旋轉時候的衰減;
4.Use Gravity(使用重力): 是否受重力影響;
5.Is Kinematic(是否受牛頓運動學影響): false,正常的物理計算,true運動只會在代碼和動畫里面受影響,普通的碰撞等都不會改變它的運動狀態;
6.Interpotate: (物體運動插值模式) None(最近計算值) Interpolate(內插值) extrapolate(外插值)
7.Collision Detection:Discrete(離散模式 資源少,靜止,低速,普通物體) Continuous(連續檢測,高速體積小,子彈)。被使用了Continusous檢測撞擊的對象(被子彈撞擊的物體),使用Continus Dynamic模式;
子彈發射碰撞物體,在兩個update之間,時間dt范圍之內,使用Discrete,子彈會偶然穿過物體,且顯示沒有發生碰撞,Continuous會判斷初始和穿過之后這段距離之間有沒有發生碰撞,有就吧子彈還原到撞到物體表面的狀態,子彈不會穿過物體。

  Discrete優點運行速度快,性能消耗小,缺點有穿透。

  Continuous優點不會穿透,缺點運行速度慢,性能消耗大。

  Continus Dynamic搭配Continuous,提升仿真效果。

8.Constraints(約束):哪個坐標軸打鈎哪個就不會改變,位置和旋轉,都可以設置。

 

剛體變量

1: 角速度(angularVelocity);
2: 線性速度(velocity);
3: 重心(center of mass)
4: 碰撞檢測開關(detectCollisions): 默認為true, 關閉檢測碰撞 false;
5: intertiaTensor慣性張量 intertiaTensorRotation 慣性張量旋轉;
6: 最大角速度(maxAngularVelocity);
7: 最大穿透速度(maxDepenetrationVelocity)
8: position:剛體的世界坐標,與圖像的transform.position盡量保持一致。因為是剛體帶動圖像在運動,所以剛體先動,然后圖像才動,所以兩者坐標大致相同。
9: rotation: 剛體在世界坐標的旋轉,與圖像的transform.rotation也是盡量保持一致。
10: useConeFiction是否使用錐形摩擦,一般false; true一般不使用;

 

創建一個ball的腳本,掛載在Sphere球體下面。ball腳本的內容:

   Rigidbody body;
// Use this for initialization void Start () { this.body = this.GetComponent<Rigidbody>(); Debug.Log(this.body.angularVelocity); // 角速度 Debug.Log(this.body.velocity); // 線性速度; Debug.Log(this.body.centerOfMass); //重心; // 關閉了以后就不會有碰撞,這個球就會穿透這個平面 // this.body.detectCollisions = false; // transform.position 也會有一個坐標大致相等。 Debug.Log(this.body.position); // 剛體所在的世界坐標 Debug.Log(this.body.rotation); // 剛體的旋轉 }

 

剛體常用方法

F *T=沖量變化=MV1-MV0

F:力的大小和方向

T:力的作用時間

當V0為0時,F *T=MV

 

世界坐標就是Scene視圖右上角那個坐標系的坐標,和物體自身的模型坐標系沒有關系。

Mesh Colllider網格碰撞器不能直接加剛體組件Rigidbody,會報錯。因為整個plane都會往下掉,觸發打鈎剛體屬性中的is Kinematic才沒事。

ball腳本里面的補充

 
         
  Rigidbody body;
  void Start () {
        this.body = this.GetComponent<Rigidbody>();

         // 力的方向,世界坐標方向上的力。
        // f * t = m * (v1 - v0) t = 0.02f;//瞬間作用力
        // this.body.AddForce(Vector3.up * this.body.mass * 10 * 20, ForceMode.Force);
        // f * t = 1.0f * (v1-v0); t = 0.02f;
        // this.body.AddForce(Vector3.up * this.body.mass * 20, ForceMode.Acceleration);
        // f * t = m * (v1-v0); t = 1.0f;//持續作用力
        // this.body.AddForce(Vector3.up * this.body.mass * 20, ForceMode.Impulse);
        //  f•1.0=1.0•v(VelocityChange)
        // this.body.AddForce(Vector3.up * this.body.mass * 20, ForceMode.VelocityChange);
        // postion世界坐標,保證在剛體內部,世界坐標的力,籃球在空中挑一下轉起來,點力
        // this.body.AddForceAtPosition(Vector3.up * this.body.mass * 20, new Vector3(-0.4f, 2.99f, 0), ForceMode.Impulse);
        // 相對與模型的坐標方向的力;籃球在空中挑一下轉起來
        // this.body.AddRelativeForce(Vector3.up * this.body.mass * 20, ForceMode.Impulse);

      // 力矩
      // this.body.AddTorque(Vector3.right * 10);//杠桿,模型繞着世界的X軸旋轉
      // this.body.AddRelativeTorque(Vector3.right * 10);//模型繞着自身的X軸旋轉
}

我覺得力分為

a.瞬間作用力

b.持續作用力

c:點力(空中挑一下籃球的某個點)

d:力矩(繞某個軸旋轉)

 

 物理管理器

1:Gravity 重力,設置重力的大小和方向;

2: Default Material:為每個物體給一個默認的物理材質;

3: Bounce Threshold 反彈閾值,低於這個不進行反彈計算;

4: SleepThreshold 休眠閾值能量低於這個閾值休眠 E = (sqrt(v) + sqrt(A)) * 0.5,休眠就是剛體休眠,如果兩個物體碰撞到一起,等能量用完了就不會去調用OnCollisionStay函數了

5: Default Contact offset默認接觸偏差,低於該值認為剛體已經接觸必須>0;

6: Solver Iteration Count關節和連接迭代次數;

7: Raycasts Hit Triggers 射線是否命中觸發器, true檢測命中, false忽略觸發器;

8:Enable Adaptive Force 允許自適應力 修正模擬運動狀態的數值偏差;

8: 碰撞矩陣,配置層級間的碰撞關系,哪些層之間會發生碰撞檢測,哪些層之間什么都不會發生;

 

物理形狀/碰撞器

is Trigger打鈎之后,只進行碰撞檢測,不進行物理運算,也就是沒有物理效果。

1:Box Collider 盒子碰撞器;
2: Sphere Collider 球體碰撞器
3: Capsule Collider 膠囊碰撞器;
4: Mesh Collider 網格碰撞器;
5: Terrian Collider 地形碰撞器;
6: Wheel Collider車輪碰撞器;

 

物理材質

是添加在碰撞器的屬性里面,create-->Phsic Material,創建好材質后,關聯到球的Collider上面,這樣球掉下來的時候就會彈起來

1:每種物體的彈力,摩擦力等物理參數可能不一樣,unity使用物理材質來描述它們;
2:Dynamic Friction 滑動摩擦
3: Static Firction 靜態摩擦
4: Bounciness 表面彈性;
5: Friction Combine 摩擦力的混合方式
6: Bounciness Combine 彈力的混合方式;,Average就是每次彈完就取平均值,慢慢停下來

 

 

注意:

Is Kinematic是剛體組件的屬性,勾選時物體不會受物理碰撞的影響,沒有碰撞效果,但是會調用碰撞函數OnCollisionEnter等。只有兩個都設置Is Kinematic的剛體之間會發生穿透現象,只有其中一個Is Kinematic則不會穿透

is trigger是碰撞器組件的屬性,勾選時物體不會受物理碰撞的影響,變得透明,但是會調用觸發器函數OnTriggerEnter等

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM