位置: 编程技术 - 正文

Unity3d 赛车车辆各类性能算法(unity3d赛车游戏毕业设计)

编辑:rootadmin
欢迎来到unity学习、unity培训、unity企业培训教育专区,这里有很多Unity3D资源、Unity3D培训视频、Unity3D教程、Unity3D常见问题、Unity3D项目源码,【狗刨学习网】unity极致学院,致力于打造业内unity3d培训、学习第一品牌。   在制作前,必须先了解真实车辆的原理:  车辆分前轮驱动,后轮驱动和四驱动。动力由引擎提供,反应的力到轮胎上,因此产生转数,即RPM。  引擎的功率可以由RPM得到公式为 : RPM = 引擎功率/2pi , 这些都是模拟,只为了更好的为下面的动作服务。还有大众关心的"漂移" ,所谓 漂移就是,在后驱车辆中,前轮方向旋转大角度,地面给于一定向心力,同时后轮又给予更多动力,导致"漂移"动作。  基于上面原理,就更容易理解下面的文章。  我先说明,有非常多种方法来开发一款赛车。本人赛车版本经过无数多种方法,无数次改版后最终选了个大众接受的。这些方法,容我一个个道来。  首先,你要明白,车辆不可能整个套一个外壳,原因是在接触地面时,对车辆所使的力不可能达到你预期的目标,引起,必须在车辆轮胎以上做外壳碰撞,轮胎以下就需要有力来支持它始终保持不掉下来。  Unity3d里有个很神奇的东西 叫WheelCollider , 它是专门模拟轮胎支持力和轮胎转数,以及轮胎横向力,前进力,以及 悬架避震系统。  这个东西非常方便,只要你把这个东西套在4个轮胎上,调试下他的forwardFriction 和 sidewaysFriction  达到你想要的效果,然后对驱动轮的motorTorque进行赋&#;,你的车辆就能动了。  记得你需要无数次调试 前进摩擦力和横向摩擦力 。  至于悬架系统在你需要时也可以改变其&#;。还有,这两个摩擦力,是一个由低到高,再由高到稳定的一条曲线。  这个WheelCollider非常好用,曾一度沉迷于此。但后来发现,他有很多不合理的地方。想要得到最好的效果,还是抛弃了他。  为了支持车辆的碰撞外壳不接触地面,必须写一个悬架动态支持力,在4个轮胎位置,支持整辆车悬浮于地面之上。  关于这个悬架动态支持力在这奉献下:  void SuspensionHoldForce()  {  float fullCompressionSpringForce = this.rigidbody.mass * 0.f * 2.0f * -Physics.gravity.y;  this.OnGround = true;  foreach( GameObject item in FwheelModels )  {  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 = 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;  onGround = 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.Dot(localVelo, groundNormal) * f;  float compression = 1.0f - ((hit.distance - radius) / suspensionTravel);  Vector3 springForce = ( fullCompressionSpringForce*compression - damperForce ) * item.transform.parent.InverseTransformDirection(Vector3.up);  springForce.z = springForce.x = 0f;  this.rigidbody.AddForceAtPosition( springForce , item.transform.parent.position );  }  else  {  this.OnGround = false;  }  }  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 = 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;  onGround = 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.Dot(localVelo, groundNormal) * f;  float compression = 1.0f - ( ( hit.distance - radius ) / suspensionTravel );  Vector3 springForce = ( fullCompressionSpringForce*compression - damperForce ) * item.transform.parent.InverseTransformDirection(Vector3.up);  springForce.z = springForce.x = 0f;  this.rigidbody.AddForceAtPosition( springForce , item.transform.parent.position );  }  else  {  this.OnGround = false;  }  }  }  那么在完成悬架支撑后,就该设计车辆动力了。  这里也有2种方法:一个方向是真实车辆行驶轨迹,另一个是模拟型车辆轨迹。  前者的方法是 , 将动力点放在车辆驱动轮上,例如后轮。用rigidbody的AddForceAtPosition可以做到,前轮只需要提供横向力就可以实现转弯的轨迹。但别看说说这么容易,这里面还涉及非常多的数&#;和曲线问题。在提供车辆动力时,你需要一条曲线,以致车辆不会匀加速,因为这样很不真实,还有在前轮横向力中,你必需是条由0到最高点,然后下降到平衡点的曲线。这样你的赛车才显得更真实。这些都需要用到几个数学知识。  后者,是用算法来模拟的一种车辆轨迹。这个算法所有作用力作用在车辆的中心点。  转弯轨迹,我是用转弯半径来表示,使得车辆在转弯时有相当的真实性,必须改变车辆转弯速度。当然,用到了些数学知识。代码奉献下:  #region 计算转弯角度  void Steering( bool canSteer , Vector3 relativeVelocity )  {  if( canSteer this.OnGround )  {  if( this.shiftthrottle == 1 )  {  this.transform.RotateAround( this.transform.TransformPoint( ( this.FwheelModels[0].transform.localPosition &#; this.FwheelModels[1].transform.localPosition) * 0.5f ) , this.transform.up , this.rigidbody.velocity.magnitude *2f* this.steeringInput * Time.deltaTime * 2f );  //~ this.rigidbody.AddForceAtPosition( this.FwheelModels[0].transform.TransformDirection(Vector3.right*this.steeringInput) * 3f * this.rigidbody.mass, this.FwheelModels[0].transform.position);  //~ this.rigidbody.AddForceAtPosition( this.FwheelModels[1].transform.TransformDirection(Vector3.right*this.steeringInput) * 3f * this.rigidbody.mass, this.FwheelModels[1].transform.position);  return ;  }  if( this.throttle * this.transform.InverseTransformDirection(this.rigidbody.velocity).z 0 )  return ;  float turnRadius = 3.0f / Mathf.Sin( (f - this.steering) * Mathf.Deg2Rad );  float minMaxTurn = EvaluateSpeedToTurn(this.rigidbody.velocity.magnitude);  float turnSpeed = Mathf.Clamp(relativeVelocity.z / turnRadius, -minMaxTurn / , minMaxTurn / );  this.transform.RotateAround( this.transform.position &#; this.transform.right * turnRadius * this.steeringInput , transform.up , turnSpeed * Mathf.Rad2Deg * Time.deltaTime * this.steeringInput );  //~ Vector3 debugStartPoint = transform.position &#; transform.right * turnRadius * this.steeringInput;  //~ Vector3 debugEndPoint = debugStartPoint &#; Vector3.up * 5f;  //~ Debug.DrawLine(debugStartPoint, debugEndPoint, Color.red);  }  }  float EvaluateSpeedToTurn( float speed )  {  if(speed this.topSpeed / 2)  return minimumTurn;  float speedIndex = 1 - ( speed / ( this.topSpeed / 2 ) );  return minimumTurn &#; speedIndex * (maximumTurn - minimumTurn);  }  #endregion  这个模拟车辆轨迹,不能达到漂移的性能,但我加了一个滑动比例计算的算法,用车辆横向移动速度,和前进速度,的比例来确定,该车辆是否处于漂移状态,如处于,则启动漂移滑动程序。当然,我的赛车是很自然的,不做做。至于轮胎痕迹,就是判断是否触底后,在该点生成轮胎痕迹gameobject,如此而已。  最后,再介绍下,所有车辆都需要模拟的,行驶时,轮胎随速度旋转这个关系到车辆看起来真实性的东西。其实非常简单。不多说,发代码:  #region 轮胎滚动与旋转模拟  void WheelRoll()  {  float averageAngularVelo = ( this.rigidbody.GetPointVelocity(this.BwheelModels[0].transform.parent.position).magnitude &#; this.rigidbody.GetPointVelocity(this.BwheelModels[0].transform.parent.position).magnitude )/2f;  float engineAngularVelo = averageAngularVelo * 3f;  float rpm = engineAngularVelo * (.0f/(2*Mathf.PI)) * (this.transform.InverseTransformDirection(this.rigidbody.velocity).z 0f ? 1f : -1f );  //~ Debug.Log(this.transform.InverseTransformDirection(this.rigidbody.velocity).z);  FwheelModels[0].transform.rotation = FwheelModels[0].transform.parent.rotation * Quaternion.Euler (RotationValue, this.steering , 0);//旋转  FwheelModels[1].transform.rotation = FwheelModels[1].transform.parent.rotation * Quaternion.Euler (RotationValue, this.steering , 0);//旋转  BwheelModels[0].transform.rotation = BwheelModels[0].transform.parent.rotation * Quaternion.Euler (RotationValue, 0, 0);//旋转  BwheelModels[1].transform.rotation = BwheelModels[1].transform.parent.rotation * Quaternion.Euler (RotationValue, 0, 0);//旋转  RotationValue &#;= rpm * ( f/f ) * Time.deltaTime;  }  #endregion更多内容,请访问【狗刨学习网】unity极致学院声明:此篇文档时来自于【狗刨学习网】社区-unity极致学院,是网友自行发布的Unity3D学习文章,如果有什么内容侵犯了你的相关权益,请与官方沟通,我们会即时处理。

推荐整理分享Unity3d 赛车车辆各类性能算法(unity3d赛车游戏毕业设计),希望有所帮助,仅作参考,欢迎阅读内容。

Unity3d 赛车车辆各类性能算法(unity3d赛车游戏毕业设计)

文章相关热门搜索词:unity3d赛车游戏毕业设计,unity出品的单机游戏赛车,unity3d汽车,unity出品的单机游戏赛车,unity赛车模型,unity3d赛车游戏的制作方法,unity3d赛车游戏教程,unity3d赛车游戏的制作方法,内容如对您有帮助,希望把文章链接给更多的朋友!

TFC冯燃:手游市场细分领域新秀崛起 狗刨学习网报道/3月日上午,第十届TFC全球移动游戏大会在北京国际会议中心开幕。本届大会以寻路、跨界、融合为主题,吸引了超过位业内重量

Unity手机游戏录像、录音sdk介入(游戏陀螺WeRecSDK) 这东西不错,如果项目需要录像回放功能,可以使用。但是在介入之前建议先试试手动的

浅析游戏引擎的资源管理机制——扒一扒Unity3D中隐藏在背后的资源管理 游戏中通常有大量资源,如网、材质、纹理、动画、着色器程序和音乐等,游戏引擎作为做游戏的工具,自然要提供良好的资源管理,让游戏开发者用

标签: unity3d赛车游戏毕业设计

本文链接地址:https://www.jiuchutong.com/biancheng/383601.html 转载请保留说明!

上一篇:Unity3D研究之角色控制器组件研究(unity 设置物体角度)

下一篇:TFC360冯燃:手游市场细分领域新秀崛起

  • PHP:Memcached::getDelayed()的用法_Memcached类

    PHP:Memcached::getDelayed()的用法_Memcached类

  • Json_encode防止汉字转义成unicode的方法(jsonobject忽略字段)

    Json_encode防止汉字转义成unicode的方法(jsonobject忽略字段)

  • MySQL中join语句的基本使用教程及其字段对性能的影响(mysql中join的用法)

    MySQL中join语句的基本使用教程及其字段对性能的影响(mysql中join的用法)

  • 详解MongoDB中创建集合与删除集合的操作方法(mongo创建db)

    详解MongoDB中创建集合与删除集合的操作方法(mongo创建db)

  • 深入分析SqlServer查询计划(深入分析的成语)

    还是来看看这个【执行过程表格】吧。我来挑几个重要的说一下。【Rows】:表示在一个执行步骤中,所产生的记录条数。(真实数据,非预期)【Executes】:表示某个执行步骤被执行的次数。(真实数据,非预期)【Stmt Text】:表示要执行的步骤的描述。【EstimateRows】:表示要预期返回多少行数据。

    在这个【执行过程表格】中,对于优化查询来说,我认为前三列是比较重要的。对于前二列,我上面也解释了,意思也很清楚。 前二列的数字也大致反映了那些步骤所花的成本,对于比较慢的查询中,应该留意它们。 【Stmt Text】会告诉你每个步骤做了什么事情。对于这种表格,它所要表达的其实是一种树型信息(一行就表示在图形方式下的一个节点), 所以,我建议从最内层开始去读它们。做为示例,我来解释一下这张表格它所表达的执行过程。

    第5行:【Clustered Index Seek(OBJECT:([MyNorthwind].[dbo].[Customers].[PK_Customers]), SEEK:([MyNorthwind].[dbo].[Customers].[CustomerID]=[MyNorthwind].[dbo].[Orders].[CustomerID]) ORDERED FORWARD)】, 意思是说,SQL Server在对表Customers做Seek操作,而且是按照【Clustered Index Seek】的方式,对应的索引是【PK_Customers】,seek的值来源于[Orders].[CustomerID]

    第4行:【Clustered Index Scan(OBJECT:([MyNorthwind].[dbo].[Orders].[PK_Orders]), WHERE:([MyNorthwind].[dbo].[Orders].[OrderDate]>='-- ::." class="img-responsive" alt="深入分析SqlServer查询计划(深入分析的成语)">

    深入分析SqlServer查询计划(深入分析的成语)

  • Win2003企业版开启FSO出现Server对象错误的解决方法(win2003r2企业版密钥)

    Win2003企业版开启FSO出现Server对象错误的解决方法(win2003r2企业版密钥)

  • linux 修改文件名 linux 批量改文件名解决方法(Linux 修改文件名后缀)

    linux 修改文件名 linux 批量改文件名解决方法(Linux 修改文件名后缀)

  • 如何禁用Win10系统搜索进程SearchUI.exe Win10搜索SearchUI.exe进程关闭的设置教程(win10如何禁用windows defender)

    如何禁用Win10系统搜索进程SearchUI.exe Win10搜索SearchUI.exe进程关闭的设置教程(win10如何禁用windows defender)

  • Win8任务管理器如何显示更多信息如进程句柄、线程等等(win8任务管理器灰色)

    Win8任务管理器如何显示更多信息如进程句柄、线程等等(win8任务管理器灰色)

  • Win8.1系统微软账号无法登陆一登陆就会出现卡屏的症状(win7微软账户)

    Win8.1系统微软账号无法登陆一登陆就会出现卡屏的症状(win7微软账户)

  • 计提的增值税和实际缴纳的差额
  • 出口退税新政策报关费发票要怎么开
  • 增量留抵税额会计处理
  • 平台怎么搞
  • 营业外收入需要结转到本年利润吗
  • 销项税最后转到哪里
  • 主营业务成本包括职工薪酬吗
  • 薪金性支出包括什么
  • 月中入职新公司社保谁交
  • 支票上哪里填付款人账号
  • 公司净资产减少
  • 物流商品采购价差如何做账
  • 网上代购收取手机费吗
  • 公司报销费用发票怎么开
  • 汇算清缴职工福利支出
  • 收到保险赔款是什么意思
  • 无形资产的初始计量和后续计量
  • 工伤保险可以税后支付吗
  • 个人抬头的通讯费可以做费用吗
  • 资本公积提取比例怎么算
  • 违约金收入计入应纳税所得额吗
  • 小规模纳税人月超10万季度不超30万
  • 汽车配件税收分类
  • 无法查明原因的现金溢余计入什么科目?
  • 子公司借款给母公司要交税吗
  • 客户少付货款怎么做账
  • 应付暂估应在何时申报
  • 印花税按含税收入还是不含税收入
  • 持续经营净利润和扣非净利润
  • 登记为一般纳税人后可以转为小规模纳税人
  • 服务费的进项税能抵扣么
  • 未完工产品成本计算公式
  • 设置戴尔笔记本锁屏时间
  • 建造合同收入的内容包括
  • 如何修改自己电脑物理地址
  • 网银年费如何做账
  • php匹配邮箱
  • linux不允许root登录
  • PHP:curl_share_init()的用法_cURL函数
  • windows7中可以设置控制计算机
  • 其他应付款转营业外收入摘要
  • 企业受赠业务的法律规定
  • php7.1
  • php中常量与变量的区别
  • 损益类科目的分类
  • cookies方法
  • vuex使用步骤
  • 期末余额跟年初余额是什么意思
  • linux php redis扩展
  • 学费入账处理
  • 支付劳务费会计科目怎么写
  • 银行结算方式有哪几种?其具体内容是什么
  • 公司买的微波炉算职工福利费吗
  • 城建税教育费附加什么时候交
  • 建筑企业成本核算方法
  • 招待费住宿
  • 公司定额征收需要什么
  • 什么是现金等价物列举
  • sqlserver数据库优化的几种方式
  • mac上怎么取消itunes自动续费
  • bios单词
  • 为什么多出一个系统
  • xp蓝屏事件
  • win10联想笔记本还原系统
  • linux 操作系统
  • win7系统纯净版和旗舰版
  • win7电脑无法正常启动系统
  • win7修改系统版本
  • Linux系统怎么安装gz包软件
  • ExtJS4给Combobox设置列表中的默认值示例
  • node链接数据库
  • javascript如何学
  • php和python有什么区别
  • inputchange
  • 疯狂android讲义和第一行代码
  • 央企收入归谁
  • 怎样在江苏智慧人社上停保
  • 购车发票购置税是否包含在内
  • 重庆地税电子税务局app
  • 所有企业都要做应急预案吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设