下載本文檔
版權(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)大角度,地面給于一定向心力,同時后輪又給予更多動力,導致漂移動作。首先,車輛不可能整個套一個外殼,原因是在接觸地面時,對車輛所使的力不可能到達你預(yù)期的目標,
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ù)學知識。Unity3D教程手冊后者,是用算法來模擬的一種車輛軌跡。這個算法所有作用力作用在車輛的中心點。轉(zhuǎn)彎軌跡,我是用轉(zhuǎn)彎半徑來表示,使得車輛在轉(zhuǎn)彎時有相當?shù)恼鎸嵭?,必須改變車輛轉(zhuǎn)彎速度。當然,用到了些數(shù)學知識。代碼如下:#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),如處于,則啟動漂移滑動程序。當然,我的賽車是很自然的,不做做。至于輪胎痕跡,就是判斷是否觸底后,在該點生成輪胎痕跡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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 三年級數(shù)學(上)計算題專項練習附答案
- 2025年乳膠脂套項目可行性研究報告
- 2024年教育型企業(yè)行業(yè)市場需求預(yù)測及投資戰(zhàn)略規(guī)劃報告
- 2025年交通客運行業(yè)女式制服項目投資可行性研究分析報告
- 2025年汽車專用工位器具行業(yè)深度研究分析報告
- 2025年中國鹽酸左氧氟沙星市場行情動態(tài)分析及發(fā)展前景趨勢預(yù)測報告
- 2025年中國精制檸檬酸鈉行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報告
- 2023-2029年中國棉紙扎鈔紙行業(yè)市場深度評估及投資戰(zhàn)略規(guī)劃報告
- 【可行性報告】2025年甲氨蝶呤項目可行性研究分析報告
- 2025年靚白柔膚水項目可行性研究報告
- 2025-2030年中國糖醇市場運行狀況及投資前景趨勢分析報告
- 冬日暖陽健康守護
- 水處理藥劑采購項目技術(shù)方案(技術(shù)方案)
- 2024級高一上期期中測試數(shù)學試題含答案
- 山東省2024-2025學年高三上學期新高考聯(lián)合質(zhì)量測評10月聯(lián)考英語試題
- 不間斷電源UPS知識培訓
- 茶室經(jīng)營方案
- 消費醫(yī)療行業(yè)報告
- 品學課堂新范式
- GB/T 1196-2023重熔用鋁錠
- 幼兒園教師培訓:計數(shù)(數(shù)數(shù))的核心經(jīng)驗
評論
0/150
提交評論