内容简介
最近在用Unity实现无人机的模拟飞行,但发现站里基本没有完整介绍如何实现该功能的博客,因时间紧迫,就自己简单做了一个仿真(不是完全按照现实物理情景来做,即通过各个螺旋桨旋转产生力带动机体飞行)。下面我会简述完全按现实物理情景实现模拟飞行,并详细描述我自己做的模拟飞行(不完全仿真),给各位提供参考。
现实物理情景的实现——简述(以四旋翼无人机为例)
因为我没有实现1:1仿真,所以这里只介绍思路,希望能给到读者一点启发。
- 构建一个四旋翼无人机模型(可以网上下载。或用Maya等建一个)
- 将模型设置为Rigidbody和BoxCollider(即实现一个物理模型,记得要先Create一个Plane承住你的模型)
- 给四个螺旋桨各写一个脚本,各产生一个向上的力
- 通过螺旋桨产生的升力即可带动模型飞行,通过控制不同螺旋桨产生升力的不同,即可实现无人机的各种飞行姿态(这步是最难的,也最花时间)
简化物理情景的实现——详述(以四旋翼无人机为例)
背景:上面的现实模拟最麻烦之处在于要对四个螺旋桨(电机)实现控制并达到平衡,太麻烦了,调试要很久,网上又没有现成的代码(至少免费的我没有发现)。所以我自己简化了一下模型,并实现所需功能。
思路:简化模型的区别在于我不用四个螺旋桨(电机)来各自产生升力,形成合力来带动机体。而是直接将力加在机身上,即跳过了前面那一步,直接用合力来实现无人机的飞行。
实现步骤:以下为实现步骤,考虑到网上好像没有相关的博客和视频教程,我会尽量详细来叙述,所以会有点多。
1.导入一个无人机模型,并给整体设置Rigidbody和BoxCollider(注意最好Collider设成和模型差不多大)。
2. 写脚本1(Plane_Text)(总共需要写两个脚本,记为脚本1和脚本2),脚本1使其产生力带动机体运动
using System.Collections;
using System.Collections.Generic;
using System.IO.Pipes;
using System.Runtime.CompilerServices;
using System.Security.Cryptography.X509Certificates;
using UnityEngine;
using UnityEngine.UI;
public class Plane_Text : MonoBehaviour
{
private Rigidbody m_Rigidbody;
public float speed = 5;
public float angle = 0;
private float x, y, z;
public Transform target;
void Start()
{
m_Rigidbody = gameObject.GetComponent<Rigidbody>();//获取组件
}
void Update()
{
var vec = new Vector3(x, y, z);
m_Rigidbody.AddForce(vec * speed, ForceMode.Force);//无人机朝vec向量方向运动,至于vec的取值由下面各个按键确定
/*******无人机飞机控制*********/
/*******W加油门(上升);S减油门(下降);A左转;D右转*********/
if (Input.GetKeyUp(KeyCode.W))
speed++;
if (Input.GetKeyDown(KeyCode.W))
x = 0;y = 1;z =