Unity3D教程:車輛性能算法_第1頁
Unity3D教程:車輛性能算法_第2頁
Unity3D教程:車輛性能算法_第3頁
Unity3D教程:車輛性能算法_第4頁
Unity3D教程:車輛性能算法_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論