案例展示

1、开发背景

仿真测试可以在开发的早期,在即便实际处理器控制器和实车都没有ready的情况下——依然能对算法进行测试,尽早发现bug,尽早解决bug,而不把过多的bug带到实车测试中去。

2、开发工具的基本使用

本项目开发工具选择Unity3D(2020.3.30f),开发语言选择C#

3、项目准备工作:导入素材搭建场景

选取我们需要的场景和车的模型,这里我们可以使用unity自带的Asset Store

在商店页面搜索Car,筛选中选择免费

这里会给我们展示出其他用户提前创建好的模型,同理搜索Road筛选出我们需要的道路。

首先导入我们的道路素材

在Hierarchy中创建一个空物体,命名为Car,Transform中,Reset位置,从我们的素材中导入汽车的预制体作为子物体。

这里需要注意的是,我们的赛车模型,主要是靠车轮碰撞器来进行移动,所以我们需要将赛车的预制体模型拆分为汽车本体以及WheelMesh

首先结储预制体子物体的关联,将四个车轮放置在WheelMesh下。

继续创建一个空物体命名为WheelColider车轮碰撞体。

4、摄像机跟随

摄像机跟随在该项目中有两种方式,最简单的方式就是直接将摄像机拖动到Car物体上,但是这样造成的问题是摄像机的移动不会十分平滑。

为了实现更加真实的场景,我们需要方式二对相机挂载脚本。

创建Folleow脚本,思路如下:

先确认好,相机初始合适的第三人称视角位置。

首先创建一个目标位置的变量,该变量通过查找标签为Player的物体获取位置。

定义一个临时变量,作为相机和车的固定距离。再定义一个临时变量用于存放摄像机位置。

固定位置变量(按照初始合适视角定义),摄像机位置等于车的位置加上固定距离。

最后让摄像机看着汽车尾部即可。

注意:这里需要将本地坐标转为世界坐标。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Follow : MonoBehaviour
{private Transform targetPos;//跟随的目标private Vector3 offsetPos;//固定位置private Vector3 tempPos;//临时变量// Start is called before the first frame updatevoid Start(){offsetPos = new Vector3(0,3,-6);targetPos = GameObject.FindGameObjectWithTag("Player").transform;}// Update is called once per framevoid FixedUpdate(){tempPos = targetPos.position + targetPos.TransformDirection(offsetPos);transform.position = Vector3.Lerp(transform.position, tempPos, Time.fixedDeltaTime * 3);transform.LookAt(targetPos);}
}

5、车轮碰撞体的添加

首先为Car添加Rigidbody(刚体组件)在这里要注意车的质量要符合实际情况,否则会抖动或者被弹飞,Boxcolider(碰撞体组件),这里初始的Boxcolider比较小,范围不够大,我们需要手动编辑一下包含车头车尾即可,不要碰撞到轮胎

在WheelColider的空物体中创建LF,添加wheel Colider组件,并调整到左前轮的位置和轮胎大小一致即可

同理为四个轮子都添加WheelColider命名为LF、RF、LB、RB。

 注意:一定要保持WheelColider和轮胎高度的一致否则会造成抖动。

6、控制赛车的移动

创建一个脚本挂载到我们的车上,思路如下:

创建我们的车轮模型变量WheelMesh,创建WheelColider变量,定义最大角度,最大扭矩。

使用键盘操作类,

1.Vertical                        对应键盘上面的上下箭头,当按下上或下箭头时触发

2.Horizontal                    对应键盘上面的左右箭头,当按下左或右箭头时触发

float v = Input.GetAxisRaw("Vertical");

float v=h = Input.GetAxisRaw("Horizontal ");

按下向上方向键,返回值为1.0

按下向下方向键,返回值为0,继续按下返回值为-1.0
当在游戏运行的时候,按下你设置好的键盘就会返回 1和-1这两个值

遍历车轮碰撞体中每一个车轮最大扭矩×h即可实现车的前进和后退。

转弯的前轮是遍历车轮碰撞体中前两个车轮,让前两个车轮转动v×最大角度

6、赛车的车轮转动效果

赛车的车轮在运动的过程中需要实现滚动的效果。遍历模型中的每一个车轮,所有轮子都绕着X轴旋转,rpm为转速。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Control : MonoBehaviour
{// Start is called before the first frame updateprivate MeshRenderer[] wheelMesh;private WheelCollider[] wheel;private float maxAngle;//转弯最大角度private float maxToque;//扭矩private float h, v;void Start(){maxAngle = 30;maxToque = 1000;wheelMesh = transform.GetChild(0).GetComponentsInChildren<MeshRenderer>();wheel = transform.GetChild(1).GetComponentsInChildren<WheelCollider>();}// Update is called once per framevoid Update(){h = Input.GetAxis("Horizontal");v = Input.GetAxis("Vertical");if (Mathf.Abs(h) == 0 && Mathf.Abs(v) == 0) return;Move();      }private void Move()//车辆移动{for (int i = 0; i < 2; i++){ wheel[i].steerAngle = h * maxAngle;}foreach (var o in wheel){o.motorTorque = maxToque * v;}for (int i = 0; i < 4;i++){wheelMesh[i].transform.localRotation = Quaternion.Euler(wheel[i].rpm*360/60,wheel[i].steerAngle,0);}}
}

7、实现赛车的Astar寻路导航

AStar算法是一种静态路网中求解最短路径最有效的直接搜索方法。在包含各种障碍物的地图中,为游戏角色的移动,寻找一条到目标地点最短路径。

AStar的核心在于将游戏背景分为一个又一个格子,每个格子有自己的靠谱值,然后通过遍历起点的格子去找到周围靠谱的格子,接着继续遍历周围…… 最终找到终点。

使用Unity自带的Navigation寻路组件,新建一个空物体作为我们的目的地,将Road设置为静态。

在导航栏中选择Windows->Navigation打开 Bake 烘培,蓝色部分即为我们烘培的可行使区域。

为Car添加NavMeshAgent组件。

为了实现寻路轨迹展示,添加LineRenderer组件,用于在Game视图中画线段。

首先需要设置Materials否则材质会丢失。

新建一个Navigation的C#脚本挂载到Car上,并选择好我们的目的地。

using UnityEngine;
using UnityEngine.AI;
using System.Collections;public class Navigation : MonoBehaviour
{public Transform TargetObject = null;void Start(){if (TargetObject != null){GetComponent<NavMeshAgent>().destination = TargetObject.position;}}void Update(){}
}

基于Unity3D的自动寻路车辆模拟相关推荐

  1. unity3d 模拟电脑实现_基于Unity3D的机器人仿真实验系统

    龙源期刊网 http://www.qikan.com.cn 基于 Unity3D 的机器人仿真实验系统 作者:庄严 卢阿丽 杨庆 来源:<电子技术与软件工程> 2018 年第 03 期 摘 ...

  2. unity3d 模拟电脑实现_基于Unity3D三维电脑组装实验系统的实现

    0 基于 Unity3D 三维电脑组装实验系统的实现 [摘要] 实验教学不仅能够培养学生的动手能力,而且还能起到巩固课本上理论知识 的作用.但是由于我们国家人口基数庞大,教育资源有限,实验器材紧缺, ...

  3. unity3d 模拟电脑实现_毕业论文 基于Unity3D的三维虚拟电脑组装实验系统开发

    第 0 页 基于 Unity3D 三维电脑组装实验系统的实现 [摘要] 实验教学不仅能够培养学生的动手能力,而且还能起到巩固课本上理论知识 的作用.但是由于我们国家人口基数庞大,教育资源有限,实验器材 ...

  4. unity3d 模拟电脑实现_基于.Unity3D的三维虚拟电脑组装实验系统开发毕业设计(含源文件).doc...

    PAGE (此文档为word格式,下载后您可任意编辑修改!) 基于Unity3D三维电脑组装实验系统的实现 [摘要]实验教学不仅能够培养学生的动手能力,而且还能起到巩固课本上理论知识的作用.但是由于我 ...

  5. unity3d 模拟电脑实现_基于Unity3d的虚拟样板房怎么制作

    1 基于Unity3d的虚拟户型展示系统 虚拟户型展示系统采用AutoCAD+3dsMax+Unity3d的开发平台,具体的流程如图1所示: 图1 开发流程 1.1 整理户型资料,建立三维模型 制作室 ...

  6. unity 陶瓷质感_一种基于Unity3D的虚拟陶瓷设计方法与流程

    本发明涉及虚拟现实领域,特别涉及一种基于Unity3D的虚拟陶瓷设计方法. 背景技术: 陶艺工艺制作环境要求严格:不仅在拉坯成型需要利用旋转机器,在烧制过程则需要窑炉锻造,如何将陶瓷制作工艺与虚拟现实 ...

  7. android自动化测试unity,基于Unity3D引擎的UI自动化测试方案

    一.基本思路 熟悉Unity3D开发后就会发现,游戏的每个场景都有一个UI树,而通过这个UI树的根节点可以遍历整个UI树的所有UI对象.而Unity3D是通过挂载脚本的方式来控制游戏逻辑的,因此我们可 ...

  8. 基于Unity3d的虚拟装配中的机械运动仿真

    基于Unity3d的虚拟装配中的机械运动仿真 前言 1.创建缸体相关的物体和对象 2.鼠标随意拖动和旋转物体的脚本 3.利用标记点进行虚拟装配 4.缸体的旋转 前言 在研究基于unity3d的虚拟装配 ...

  9. 基于Abaqus-Simpack联合仿真车辆-浮置板轨道耦合动力学仿真

    作者: CAE兮枫如秋 仿真秀专栏作者 一.城市轨道交通中钢弹簧浮置板高级减振轨道 城市轨道交通不仅作为城市亮丽的名片,还在解决城市交通问题中具有特殊的地位和作用.城市轨道交通也是一种安全.快捷.准时 ...

最新文章

  1. 青龙面板node-onebot 教程
  2. BP神经网络(检测故障的实例)
  3. string to byte[]
  4. Windows 10 Edge 浏览器续航对比火狐/Chrome
  5. BZOJ1911:[Apio2010]特别行动队——题解
  6. 公需科目必须学吗_税务师要继续教育吗,2019税务师怎样继续教育?
  7. gdb 查看结构体地址内容_程序员的术与道:术——gdb基本操作
  8. JWT 介绍 - Step by Step
  9. ASP.net 2.0 自定义控件的开发之数据分页 第五章
  10. php oracle数据库连接池,数据库管理Oracle 连接池信息的修改
  11. stack 和 heap区别
  12. GreenPlum常用数值计算函数
  13. 基于python的博客设计_基于Pyt hon的博客设计
  14. 小程序入门第二课 — 组件与WXML语法
  15. Lenovo 使用BoMC工具制作微码升级U盘刷新System x
  16. 谈 Linux,Windows 和 Mac -王银纠正对linux的看法
  17. pe管厂家_mpp管与PE管的区别
  18. Oracle 11g RAC 原地升级到 19c
  19. matlab 编程之全局变量(global)和永久变量(persistent)
  20. Symbian OS通讯录

热门文章

  1. Java、JSP飞机航班信息查询系统
  2. 新手如何安装ai换脸软件deepfacelab中文版
  3. 天网 20230112
  4. 借款久期还款久期 简述
  5. 西夏文可用电脑录入了【ZZ】
  6. 程序员2年苦心积攒学习资料【下载】
  7. [转]尚学堂科技 - 马士兵老师-JAVA自学之路
  8. 职场中年人,愿你终能体面的离开
  9. 7-4 list 存储动物对象 (10 分)
  10. 网络设备构成及管理方式