日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

详解Unity中的车轮碰撞器Wheel Collider

發布時間:2023/12/20 编程问答 70 豆豆
生活随笔 收集整理的這篇文章主要介紹了 详解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總空物體上,截圖和代碼如下:

private float angle;public float angleSpeed;public float moveSpeed;//注意這八個變量,四個是獲取車輪碰撞器的,四個是獲取車輪模型的public WheelCollider leftF;public WheelCollider leftB;public WheelCollider rightF;public WheelCollider rightB;public Transform model_leftF;public Transform model_leftB;public Transform model_rightF;public Transform model_rightB;void Update(){WheelsControl_Update();}//控制移動 轉向void WheelsControl_Update(){//垂直軸和水平軸float h = Input.GetAxisRaw("Horizontal");float v = Input.GetAxisRaw("Vertical");//前輪角度,后輪驅動//steerAngle:轉向角度,總是圍繞自身Y軸,轉向//motorTorque:電機轉矩,驅動車輪angle = angleSpeed * h;leftF.steerAngle = angle;rightF.steerAngle = angle;leftB.motorTorque = v * moveSpeed;rightB.motorTorque = v * moveSpeed;//當車輪碰撞器位置角度改變,隨之也變更車輪模型的位置角度WheelsModel_Update(model_leftF, leftF);WheelsModel_Update(model_leftB, leftB);WheelsModel_Update(model_rightF, rightF);WheelsModel_Update(model_rightB, rightB);}//控制車輪模型移動 轉向void WheelsModel_Update(Transform t, WheelCollider wheel){Vector3 pos = t.position;Quaternion rot = t.rotation;wheel.GetWorldPose(out pos, out rot);t.position = pos;t.rotation = rot;}

二、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,各個車型略有不同。
下面簡要模擬了一下:

public float moveSpeed = 1500;public float maxAngle = 35;public float angleSpeed = 50;public WheelCollider leftF;public WheelCollider leftB;public WheelCollider rightF;public WheelCollider rightB;private void Update(){float v = Input.GetAxisRaw("Vertical");leftB.motorTorque = v * moveSpeed;rightB.motorTorque = v * moveSpeed;//左轉向if (Input.GetKey(KeyCode.A)){//Debug.Log(leftF.steerAngle);leftF.steerAngle -= Time.deltaTime * angleSpeed;rightF.steerAngle -= Time.deltaTime * angleSpeed;if (leftF.steerAngle < (0-maxAngle) || rightF.steerAngle < (0-maxAngle)){//到最大值后就不能繼續加角度了leftF.steerAngle = (0 - maxAngle);rightF.steerAngle = (0 - maxAngle);}}//右轉向if (Input.GetKey(KeyCode.D)){leftF.steerAngle += Time.deltaTime * angleSpeed;rightF.steerAngle += Time.deltaTime * angleSpeed;if (leftF.steerAngle > maxAngle || rightF.steerAngle > maxAngle){leftF.steerAngle = maxAngle;rightF.steerAngle = maxAngle;}}//松開轉向后,方向打回if (Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.D))leftF.steerAngle = rightF.steerAngle = 0;}

3.breakTorque

制動扭矩,單位還是N.m,必須為正數,用于剎車。看下面的代碼就理解了。
至于這個數量設置多少合適,個人認為比車輛扭矩大一點就可以了,自己調整著來吧,反正也沒個定值。

public float breakMove = 1000f;bool isBraking = Input.GetKey(KeyCode.Space);leftB.brakeTorque = isBraking ? breakMove : 0f;rightB.brakeTorque = isBraking ? breakMove : 0f;

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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产资源在线播放 | 欧美激情视频网站 | 嫩模被强到高潮呻吟不断 | 亚洲欧美在线视频观看 | 伦乱天堂 | 欧美日韩免费看 | 国产人妻精品一区二区三 | 全毛片| 成人免费观看网站 | 成人美女在线观看 | 男女男精品视频站 | 欧美v日韩 | 日韩欧美在线免费 | 日韩精品区 | 黄色一级大片在线免费看国产一 | 亚洲丝袜视频 | 国产黄页 | 热久久最新网址 | 国产精品5 | 香蕉视频在线播放 | av在线收看 | 污污视频在线观看免费 | www.激情.com| 在线观看自拍 | 日韩一区二区三区四区 | 奇米四色在线观看 | www精品一区二区三区 | 小早川怜子久久精品中文字幕 | 久久久久久久久久久久久女国产乱 | 小毛片在线观看 | 精品人妻人伦一区二区有限公司 | 国产人成在线观看 | 杨幂毛片 | 亚洲美女中文字幕 | 黄色小视频在线观看免费 | 国产一区二区视频免费在线观看 | 国产精品自拍一区 | 黄色av影视 | 深夜激情影院 | 极品videosvideo喷水 | 玩弄丰满少妇xxxxx性多毛 | 催眠美妇肉奴系统 | 蜜臀久久99精品久久久画质超高清 | 久久国产精品国产精品 | 久久久黄色 | 999在线视频 | 双性娇喘浑圆奶水h男男漫画 | 四月婷婷 | 亚洲免费黄色片 | 少妇偷人精品无码人妻 | 一级全黄少妇性色生活片 | 熟女毛毛多熟妇人妻aⅴ在线毛片 | 成人天堂| 在线观看网站污 | 色哟哟在线视频 | 五十路av | 亚洲一级成人 | 欧美丰满熟妇xxxxx | 青青草原国产在线观看 | 一区在线不卡 | 被黑人各种姿势猛c哭h文1 | 国产精品人人爽人人爽 | 天天噜日日噜 | 亚洲精品99久久久久中文字幕 | 91在线影院 | 久久综合久久网 | 韩国19主播内部福利vip | 国产91啪| 99热国产在线 | 人操人| 黄色免费在线观看视频 | 欧美在线黄 | 涩涩的视频在线观看 | 伊人天天 | 亚洲AV无码成人精品区先锋 | 男女ss视频 | 爱久久视频 | 亚州春色 | 吊侵犯の奶水授乳羞羞漫画 | 天堂中文字幕免费一区 | 人人看av| 黄色片网站在线 | 色先锋av资源 | 蜜臀久久99精品久久一区二区 | www.欧美日韩| 少妇av一区二区 | 午夜理伦三级理论 | 天天草天天干 | 奇米888一区二区三区 | 在线观看免费大片 | 久久免费视频一区 | 日韩久久久久久久久久 | 爱爱三级视频 | 911毛片 | 国产精品对白 | 91成人入口 | xxxxx黄色片 噜噜噜噜噜色 | 欧美风情第一页 | 亚洲一区欧美激情 |