汽车轮⼦转动原理
1,加减档系统。所谓变速箱其实可以抽象为⼀个数组,每个数表⽰引擎⼒与轮⼦⼒的线性对应关系。汽车⼀般为6个档位,那么我们数组的
⼤⼩也应该是6。动⼒来⾃引擎,通过当前档位计算出轮⼦的⼒矩,从⽽使轮⼦转动。
另⼀⽅⾯我们捕获轮⼦的转速,通过当前档位再计算出引擎当前的转速。我们限定了引擎的最⼤与最⼩转速,规定:引擎达到最⼤转速的时
候,加档;减速到最⼩转速的时候,减档。这样就实现了汽车的⾃动加减档,当然也可以做成⼿动的。
2,unity3d的wheelCollider(轮⼦碰撞器)。我们可以通过给wheelCollider⼀个⼒,它就可以⾃动实现滚动的物理效果,同时,我们可以通
过代码捕获它的转速,这恰恰符合我们的要求。更强⼤的是,我们可以设置轮⼦的横向与纵向摩擦⼒,设置轮⼦的悬挂系统参数,通过这些
设置可以模拟汽车的避震,漂移等效果。
sionSpring悬挂系统;
dFriction轮⼦的纵向摩擦⼒(车⼦前进后退⽅向的摩擦⼒);
ysFriction轮⼦的横向摩擦⼒;
unSlip;ExtremumValue;AsymptoteSlip;AsymptoteValue这四个值其实是坐标系上的两个坐标,他们确定了⼀个滑动距
离与摩擦⼒的关系曲线。
essFactor可以整体调节摩擦曲线的倍数。
3,unity3d的Rigidbody(刚体)。我们可以赋予刚体质量,并且刚体是受重⼒影响的。车重的不同也会影响汽车的⾏驶效果!我们⼀般按
真实世界的数值来,例如汽车的mass我们可以设为6000左右(单位为kg),包括模型的尺⼨,也最好与真实尺⼨⼀致(单位为⽶)。这样
我们才能获得更真实的物理效果,下⾯分享⼀下关于unitywheelcollider轮⼦转动的主要代码。
usingUnityEngine;
tions;
publicclassCarControl:MonoBehaviour{
//操纵前轮,⽤于转向
publicWheelColliderFrontLeftWheel;
publicWheelColliderFrontRightWheel;
publicWheelColliderBackLeftWheel;
publicWheelColliderBackRightWheel;
//齿轮数组
publicfloat[]GearRatio;
//当前档位
publicintCurrentGear=0;
publicfloatEngineTorgue=600.0f;
publicfloatMaxEngineRPM=3000.0f;
publicfloatMinEngineRPM=1000.0f;
privatefloatEngineRPM=0.0f;
//Uthisforinitialization
voidStart(){
//设置车的重⼼,使车更稳定
Vector3centerOfMass=OfMass;
centerOfMass.y=-1.5f;
OfMass=centerOfMass;
}
//Updateiscalledonceperframe
voidUpdate(){
//限制车的最⼤速度,调整阻⼒可能不是最好的做法。但它很简单,⽽且不会⼲扰物理系统的运⾏。
=ude/250;
//通过两个轮⼦的平均rpm,计算引擎rpm,然后切换档位
EngineRPM=(+)/2*GearRatio[CurrentGear];
ShiftGears();
//设置换档的声⾳
=(EngineRPM/MaxEngineRPM)+1.0f;
if(>2.0)
{
=2.0f;
}
//最后设置轮⼦转动⼒矩。引擎⼒矩除以当前档位,乘以⽤户输⼊值。
//轮⼦⼒矩提供⼀个汽车前进的⼒。轮⼦的转动⼜会提⾼档位。
orque=EngineTorgue/GearRatio[CurrentGear]*s("Vertical");
orque=EngineTorgue/GearRatio[CurrentGear]*s("Vertical");
//转动⾓度是任意数乘以⽤户输⼊值
ngle=20*s("Horizontal");
ngle=20*s("Horizontal");
}
voidShiftGears()
{
intAppropriateGear=CurrentGear;
if(EngineRPM>=MaxEngineRPM)
{
AppropriateGear=CurrentGear;
for(inti=0;i<;i++)
{
if(*GearRatio
{
AppropriateGear=i;
break;
}
}
CurrentGear=AppropriateGear;
}
if(EngineRPM<=MaxEngineRPM)
{
AppropriateGear=CurrentGear;
for(intj=-1;j>=0;j--)
{
if(*GearRatio[j]>MinEngineRPM)
{
AppropriateGear=j;
break;
}
}
CurrentGear=AppropriateGear;
}
}
本文发布于:2022-11-27 00:16:38,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/27526.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |