详解Unity中的车轮碰撞器Wheel Collider
前言
碰撞體組件定義了物體的物理性狀,Unity中有一系列基本碰撞體,我們可以使用它們組合成任意形狀,但除了基本碰撞體之外,Untiy還提供了諸如車輪(Wheel)、網格(Mesh)、地形(Terrain)等碰撞器,就比如Wheel Collider,該碰撞器用以實現車輛模擬,它可以模型車輛的前進后退,剎車,轉向,打滑等。今天就簡要介紹一下該組件的使用。
目錄
- 前言
- 一、先做一輛小汽車
- 1.如何實現?實現效果展示
- 2.實現步驟
- 3.注意事項
- 4.代碼實現
- 二、Wheel Collider組件參數介紹
- 1.Mass質量 & Radius 半徑
- 2.Wheel Damping Rate
- 3.Suspension Distance
- 4.Force App Point Distance
- 5.Suspension Spring
- 6.Forward Friction & Sideways Friction
- 三、Wheel Collider API
- 1.motorTorque
- 2.steerAngle
- 3.breakTorque
- 4.rpm
- 五、總結和參考資料
- 1.總結
- 2.參考資料
前排提醒:本文僅代表個人觀點,以供交流學習,若有不同意見請評論留言,筆者一定好好學習,天天向上。
閱讀此文章時,若有不理解的地方,推薦觀看本文列出的參考資料來對照閱讀。
閱讀本篇前,請先了解“剛體和碰撞體”相關知識。
Unity版本[2019.4.10f1] 夢小天幼 & 禁止轉載
視頻講解:
詳解Unity的車輪碰撞器_BiLiBiLi
一、先做一輛小汽車
車輪碰撞器顧名思義,肯定是用于模擬車輪的,你可以用它來模擬自行車、三輪車、小汽車、大貨車,統統都可以!該碰撞體內置了碰撞檢測、車輪物理組件和基于打滑的輪胎摩擦模型。是專為車輪而生的碰撞器!
1.如何實現?實現效果展示
So,先從使用車輪碰撞器做一輛車車開始,首先想想若使用傳統方法做汽車,車輪應當如何實現?
用transform位移,然后每秒轉幾圈、拐彎時車輪和車體整體都要偏移,很難做出車輪拐彎車體不動的效果,這時候使用剛體來驅動或許效果會好一點,但是它的模擬力不能確定,還有懸掛,剎車,打滑等又要如何實現?所以如果我們用自己的想法來實現一輛小汽車,可能困難重重,但!Unity為我們提供了車輪碰撞器!它可以解決上述所有問題!
老規矩,先看實現效果,再細說實現流程。
通過這個動圖,我們可以清楚的看到,小汽車可以前進后退,轉彎,打滑。下面來說說詳細的實現步驟
2.實現步驟
首先我們要認識到空物體的重要性,舉個例子,那就相當于電腦中的文件夾,它沒有什么實際的功能,但是它可以幫我們將一大堆資源合理擺放,我們要做一輛汽車,為了便于腳本控制和方便我們管理,所以首先我們要建立一個汽車的空物體,這是一個"總文件夾",場景中和汽車相關的都放在這里。其次我們建立三個"子文件夾(三個空物體)",分別存放汽車主體模型,汽車輪胎,汽車輪胎的車輪碰撞體。
你可能會疑惑?什么汽車輪胎和汽車輪胎的WheelCollider要分類存放,碰撞體組件不是依附在汽車輪胎模型上的嗎?答案如下:
不必通過轉動或滾動 WheelCollider 對象來控制汽車;附加了 WheelCollider 的對象應始終相對于汽車本身固定。但是,可能會需要車輪會旋轉移動之類的動畫操作。最好的方法是為 WheelCollider(依附于空物體)和車輪模型設置單獨的對象(引用自Unity官方文檔,經過簡要修改)
所以我們建立好三個空物體,存放汽車主體模型、車輪模型、碰撞體,車體模型用最基本的正方體堆一個就行,車輪模型使用圓球,壓扁它當作車輪(為什么不用圓柱體,因為它的軸向不對,大家可以拿一個圓柱體試試看),碰撞體需要單獨建四個空物體,然后為它們加上WheelCollider。So,結構圖如下。
3.注意事項
寫代碼前,有幾點需要注意的事項。(很重要!!!)
首先要在最上層的空物體上加上剛體組件,也就是"Car",更改質量參數Mass,大概1500(普通小汽車的重量),其他不用改。這樣做的目的是給車加上重量,以及讓車具有物理特性。且!如果不給WheelCollider的父級或父父級加上剛體組件的話,WheelCollider是不會顯示在Scene窗口中的。
其次,刪除汽車車輪模型上的自帶的碰撞體,因為WheelCollider本身就具有碰撞,所以車輪模型的作用就只是動畫而已,其物理特性,完全由WheelCollider控制的。
最后,WheelCollider的位置和車輪模型的位置要一樣,大致一樣就行。因為它們分開是為了方便控制,但本身它們就應該在同一個位置,一個負責外形,一個負責物理實現。
最后的最后,若WheelCollider的半徑太小,調整其Radius參數即可
4.代碼實現
該腳本掛載到任何地方都行,建議掛載到Car總空物體上,截圖和代碼如下:
二、Wheel Collider組件參數介紹
現在你已經完成了一輛小汽車了,是不是成就感滿滿,然后呢我們就來詳細說說該組件都有什么參數,看起來一大堆很唬人是吧,咱就挑些重點的說說,其他的先不涉及。
1.Mass質量 & Radius 半徑
顧名思義,質量值一般就設置為單個輪胎重量就行,和現實世界不要差太多,半徑就是半徑,不多解釋,自己調一調試一試。
2.Wheel Damping Rate
應用于車輪的阻尼值。阻尼是作用于運動物體的阻力,值越大,車越難打滑。
3.Suspension Distance
車輪懸掛的最大延伸距離,懸掛始終向下延伸穿過自身Y軸,就是懸掛高度,始終是垂直向下的。這個要看你做什么車,比如汽車,底盤低,默認值我覺得就OK,但是那種越野車就需要把該值改高一點了。設置為0,那么車本身的轉向避震就會很生硬,像個方塊一樣。
4.Force App Point Distance
車輪的受力點,默認位于靜止車輪的底部(如下圖),一般無需改動。
5.Suspension Spring
設置懸掛系統相關參數:
1.Spring :
值越大,懸架抵達目標位置就越快,就是懸架彈簧彈一個來回的時間的快慢
2.Damper :
抑制懸架速度,這個參數和上一個是相輔相成的(應該是相愛相殺),若想要到達自己需要的懸架數據,需不斷調整。
3.Target Position :
這個值就是在靜止狀態下的懸架展開程度(根據懸架距離Supension Distance計算),也就是說懸架靜止狀態下的展開和壓縮并不是有車體重量控制的,而是這個參數來控制的。默認0.5,符合正常的汽車懸架。值為1完全展開,為0完全壓縮。
6.Forward Friction & Sideways Friction
根據名字應該就知道,這兩組參數用于設置車輪的縱向(前進后退)和橫向(轉向)的摩擦特性。
該如何理解呢?
Extremum Slip ,Extremum Value
Asymptote Slip,Asymptote Value
上述四個值是坐標系的兩個坐標,它們確定了一個滑動距離與摩擦力的關系曲線
(該圖截取自Unity官方文檔)
Stiffnes :該值則整體調節摩擦曲線的倍數
若是上面不理解直接修改這個就可以,新手不建議動上面四個變量,因為在不懂的情況下修改會產生很奇怪的效果。
下圖演示了僅修改車輪縱向的Stiffnes的值:
通過在運行時改變該值用以模擬各種地面材質(注意,物理材質在車輪碰撞器上是無效的,所以需要通過修改該值來模擬各種地面)
三、Wheel Collider API
學習WheelCollider的API可以讓我們更好的對車輪進行控制,比如上面的做一個小汽車的案例,就使用了該碰撞器的兩個變量,motorTorque和steerAngle。下面簡要講述一下這些API吧。
| motorTorque | 輪軸上的電機扭矩 | 牛米 | |
| steerAngle | 轉向角度 | 度 | |
| breakTorque | 制動扭矩 | 牛米 | |
| rpm | 當前輪軸轉速 | 每分鐘/轉 | 只讀 |
| forwardFriction | 車輪前進方向上的摩擦 | ||
| sidewaysFriction | 車輪側向上的摩擦 | ||
| wheelDampingRate | 車輪的阻尼率,必須大于零 | ||
| GetWorldPose(V3 pos, Quat quat) | 獲取車輪世界空間姿態 | 獲取WheelCollider參數同步到模型輪胎上,使其轉動 | |
| 參考本篇1-4代碼實現部分,第46行 |
挑幾個重點說說:
1.motorTorque
此參數用于調整車輪的轉動,也就是傳說中的前進與后退。比如你想要做一輛后驅車,就只應該設置后兩個車輪受控。單位是牛米(N.m),是力的單位和距離的單位的乘積。
這里套用現實世界的知識,扭矩決定了發動機輸出的力度,曲軸轉速的變化、汽車的爬坡能力、起步速度及加速性。理論上,扭矩越大,起步速度就越快。(僅供理解,Unity中和現實世界還是不一樣的)
該值設置過低會出現顛簸的情況。
對了!通過調整左右車輪的扭矩大小,應當可以模擬坦克轉向!回頭可以試試。
2.steerAngle
該值用以轉向。以度為單位。一般來講要模擬真實車輛,肯定不能直接設置該值多少度,這樣太突兀了。比如設置當按下左方向鍵后2秒,角度才完全打完,這樣模擬向左打方向盤。現實世界中車輪轉向角度為30-40,各個車型略有不同。
下面簡要模擬了一下:
3.breakTorque
制動扭矩,單位還是N.m,必須為正數,用于剎車。看下面的代碼就理解了。
至于這個數量設置多少合適,個人認為比車輛扭矩大一點就可以了,自己調整著來吧,反正也沒個定值。
4.rpm
該車輪每分鐘的轉速,該參數可以拿來計算汽車的速度。
Rpm = wheel.rpm * (wheel.radius * 2 * Mathf.PI) * 60 / 1000);
五、總結和參考資料
1.總結
我們通過Unity提供的Wheel Collider用以模擬各種車輛,它們的前進后退,制動,轉向,懸掛等功能。
- 通過motorTorque控制車輛扭矩
- 通過steerAngle控制車輛轉向
- 通過breakTorque控制車輛制動
注意點:
- 碰撞器最上層空物體一定要加剛體組件
- 汽車輪胎模型自動的碰撞體記得刪除
- 汽車輪胎模型和車輪碰撞體分別存放
車輪碰撞體參數:可設置該車輪的質量、半徑、阻尼、懸掛、摩擦等特性。
2.參考資料
[1].天孤寒羽.unity小案例教程第二期(汽車)BiliBili
[2].Unity官方.Unity官方文檔 車輪碰撞體
[3].Unity官方.Unity官方文檔 WheelCollider API
[4].CoderZ1010.Unity 【Wheel Collider】實現游戲中的車具控制(CSDN)
[5].泰課在線.unity wheelcollider輪子轉動
總結
以上是生活随笔為你收集整理的详解Unity中的车轮碰撞器Wheel Collider的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sketch添加组件库
- 下一篇: 计算机科学教育英文论文题目,学生方面计算