下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、-. z.Unity3D教程:車輛性能算法Posted on 2013年06月05日 by U3d / Unity3D 根底教程/被圍觀 123 次首先要了解真實車輛的原理:車輛分前輪驅(qū)動,后輪驅(qū)動和四驅(qū)動。動力由引擎提供,反響的力到輪胎上,因此產(chǎn)生轉(zhuǎn)數(shù),即RPM。引擎的功率可以由RPM得到公式為 : RPM = 引擎功率60/2pi ,這些都是模擬,只為了更好的為下面的動作效勞。還有群眾關(guān)心的漂移,所謂漂移就是,在后驅(qū)車輛中,前輪方向旋轉(zhuǎn)大角度,地面給于一定向心力,同時后輪又給予更多動力,導(dǎo)致漂移動作。首先,車輛不可能整個套一個外殼,原因是在接觸地面時,對車輛所使的力不可能到達你預(yù)期的目標(biāo),
2、引起,必須在車輛輪胎以上做外殼碰撞,輪胎以下就需要有力來支持它始終保持不掉下來。Unity3D中有個WheelCollider ,它是專門模擬輪胎支持力和輪胎轉(zhuǎn)數(shù),以及輪胎橫向力,前進力,以及懸架避震系統(tǒng)。這個東西非常方便,只要你把這個東西套在4個輪胎上,調(diào)試下他的forwardFriction 和 sidewaysFriction到達你想要的效果,然后對驅(qū)動輪的motorTorque進展賦值,你的車輛就能動了。記得你需要無數(shù)次調(diào)試前進摩擦力和橫向摩擦力。至于懸架系統(tǒng)在你需要時也可以改變其值。還有,這兩個摩擦力,是一個由低到高,再由高到穩(wěn)定的一條曲線。這個WheelCollider非常好用,曾
3、一度沉迷于此。但后來發(fā)現(xiàn),他有很多不合理的地方。想要得到最好的效果,還是拋棄了他。為了支持車輛的碰撞外殼不接觸地面,必須寫一個懸架動態(tài)支持力,在4個輪胎位置,支持整輛車懸浮于地面之上。關(guān)于這個懸架動態(tài)支持力:void SuspensionHoldForce()float fullpressionSpringForce =this.rigidbody.mass* 0.25f * 2.0f *-Physics.gravity.y;this.OnGround=true;foreach( GameObject item in FwheelModels ) RaycastHit hit;bool onG
4、round = Physics.Raycast( item.transform.parent.position , -item.transform.parent.InverseTransformDirection(Vector3.up), out hit, this.suspensionTravel+this.radius);if(onGround & hit.collider.isTrigger) onGround =false;float dist =this.suspensionTravel+this.radius; RaycastHit hits = Physics.RaycastAl
5、l( item.transform.parent.position , -item.transform.parent.InverseTransformDirection(Vector3.up) , this.suspensionTravel+this.radius);foreach(RaycastHit test in hits)if(!test.collider.isTrigger& test.distance= dist) hit = test; onGround =true; dist = test.distance;if( onGround ) Vector3 wheelVelo =t
6、his.rigidbody.GetPointVelocity(item.transform.parent.position); Vector3 localVelo = transform.InverseTransformDirection(wheelVelo); Vector3 groundNormal = transform.InverseTransformDirection(hit.normal);float damperForce = Vector3.Dot(localVelo, groundNormal)* 5000f;float pression = 1.0f -(hit.dista
7、nce- radius)/ suspensionTravel); Vector3 springForce =( fullpressionSpringForce*pression - damperForce )* item.transform.parent.InverseTransformDirection(Vector3.up); springForce.z= springForce.*= 0f;this.rigidbody.AddForceAtPosition( springForce , item.transform.parent.position);elsethis.OnGround=f
8、alse;foreach( GameObject item in BwheelModels ) RaycastHit hit;bool onGround = Physics.Raycast( item.transform.parent.position, -item.transform.parent.InverseTransformDirection(Vector3.up), out hit, this.suspensionTravel+this.radius);if(onGround & hit.collider.isTrigger) onGround =false;float dist =
9、this.suspensionTravel+this.radius; RaycastHit hits = Physics.RaycastAll( item.transform.parent.position, -item.transform.parent.InverseTransformDirection(Vector3.up) , this.suspensionTravel+this.radius);foreach(RaycastHit test in hits)if(!test.collider.isTrigger& test.distance= dist) hit = test; onG
10、round =true; dist = test.distance;if( onGround ) Vector3 wheelVelo =this.rigidbody.GetPointVelocity(item.transform.parent.position); Vector3 localVelo = transform.InverseTransformDirection(wheelVelo); Vector3 groundNormal = transform.InverseTransformDirection(hit.normal);float damperForce = Vector3.
11、Dot(localVelo, groundNormal)* 5000f;float pression = 1.0f -( hit.distance- radius )/ suspensionTravel ); Vector3 springForce =( fullpressionSpringForce*pression - damperForce )* item.transform.parent.InverseTransformDirection(Vector3.up); springForce.z= springForce.*= 0f;this.rigidbody.AddForceAtPos
12、ition( springForce , item.transform.parent.position);elsethis.OnGround=false;則在完成懸架支撐后,就該設(shè)計車輛動力了。這里也有2種方法:一個方向是真實車輛行駛軌跡,另一個是模擬型車輛軌跡。前者的方法是,將動力點放在車輛驅(qū)動輪上,例如后輪。用rigidbody的AddForceAtPosition可以做到,前輪只需要提供橫向力就可以實現(xiàn)轉(zhuǎn)彎的軌跡。但別看說說這么容易,這里面還涉及非常多的數(shù)值和曲線問題。在提供車輛動力時,你需要一條曲線,以致車輛不會勻加速,因為這樣很不真實,還有在前輪橫向力中,你必需是條由0到最高點,然后
13、下降到平衡點的曲線。這樣你的賽車才顯得更真實。這些都需要用到幾個數(shù)學(xué)知識。Unity3D教程手冊后者,是用算法來模擬的一種車輛軌跡。這個算法所有作用力作用在車輛的中心點。轉(zhuǎn)彎軌跡,我是用轉(zhuǎn)彎半徑來表示,使得車輛在轉(zhuǎn)彎時有相當(dāng)?shù)恼鎸嵭?,必須改變車輛轉(zhuǎn)彎速度。當(dāng)然,用到了些數(shù)學(xué)知識。代碼如下:#region 計算轉(zhuǎn)彎角度void Steering(bool canSteer , Vector3 relativeVelocity )if( canSteer &this.OnGround)if(this.shiftthrottle=1)this.transform.RotateAround(this.
14、transform.TransformPoint(this.FwheelModels0.transform.localPosition+this.FwheelModels1.transform.localPosition)* 0.5f ) , this.transform.up , this.rigidbody.velocity.magnitude*2f*this.steeringInput* Time.deltaTime* 2f );/ this.rigidbody.AddForceAtPosition( this.FwheelModels0.transform.TransformDirec
15、tion(Vector3.right*this.steeringInput) * 3f * this.rigidbody.mass, this.FwheelModels0.transform.position);/ this.rigidbody.AddForceAtPosition( this.FwheelModels1.transform.TransformDirection(Vector3.right*this.steeringInput) * 3f * this.rigidbody.mass, this.FwheelModels1.transform.position);return;i
16、f(this.throttle*this.transform.InverseTransformDirection(this.rigidbody.velocity).zthis.topSpeed/2)return minimumTurn;float speedInde* =1-( speed /(this.topSpeed/2);return minimumTurn + speedInde* *(ma*imumTurn - minimumTurn);#endregion這個模擬車輛軌跡,不能到達漂移的性能,但我加了一個滑動比例計算的算法,用車輛橫向移動速度,和前進速度,的比例來確定,該車輛是否處
17、于漂移狀態(tài),如處于,則啟動漂移滑動程序。當(dāng)然,我的賽車是很自然的,不做做。至于輪胎痕跡,就是判斷是否觸底后,在該點生成輪胎痕跡gameobject,如此而已。Unity3D教程手冊最后,再介紹下,所有車輛都需要模擬的,行駛時,輪胎隨速度旋轉(zhuǎn)這個關(guān)系到車輛看起來真實性的東西。其實非常簡單。代碼如下:#region 輪胎滾動與旋轉(zhuǎn)模擬void WheelRoll()float averageAngularVelo =(this.rigidbody.GetPointVelocity(this.BwheelModels0.transform.parent.position).magnitude+thi
18、s.rigidbody.GetPointVelocity(this.BwheelModels0.transform.parent.position).magnitude)/2f;float engineAngularVelo = averageAngularVelo * 3f;float rpm = engineAngularVelo *(60.0f/(2*Mathf.PI)*(this.transform.InverseTransformDirection(this.rigidbody.velocity).z 0f 1f :-1f );/ Debug.Log(this.transform.InverseTra
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024特崗教師聘用及教師團隊協(xié)作能力提升服務(wù)合同3篇
- 2025年度新能源車輛采購及維護服務(wù)合同范本2篇
- 2025年度智能家居系統(tǒng)代理商合作協(xié)議4篇
- 2025年度新能源汽車研發(fā)出資人合作協(xié)議4篇
- 2025年度旅游景區(qū)特色商品檔口租賃經(jīng)營合同3篇
- 2025年度水電工程安全監(jiān)測系統(tǒng)安裝與維護服務(wù)合同3篇
- 2024版食堂承包合同協(xié)議范文
- 2025年度特殊崗位人員辭退及安置協(xié)議范本4篇
- 2025年度智能機器人研發(fā)股權(quán)合作協(xié)議4篇
- 2025年度文化產(chǎn)業(yè)園區(qū)運營管理合同3篇
- 小學(xué)數(shù)學(xué)六年級解方程練習(xí)300題及答案
- 電抗器噪聲控制與減振技術(shù)
- 中醫(yī)健康宣教手冊
- 2024年江蘇揚州市高郵市國有企業(yè)招聘筆試參考題庫附帶答案詳解
- 消費醫(yī)療行業(yè)報告
- 品學(xué)課堂新范式
- GB/T 1196-2023重熔用鋁錠
- 運輸行業(yè)員工崗前安全培訓(xùn)
- 公路工程安全風(fēng)險辨識與防控手冊
- 幼兒園教師培訓(xùn):計數(shù)(數(shù)數(shù))的核心經(jīng)驗
- 如何撰寫和發(fā)表高水平的科研論文-good ppt
評論
0/150
提交評論