[图文教程] Unity3D简易直升机飞行控制

2015年03月13日 13:46 0 点赞 0 评论 更新于 2017-05-08 12:37

有朋友询问如何在Unity3D中实现简易直升机飞行控制,针对这个问题,我编写了一个简化的直升机飞行控制案例。

一、直升机模型创建

首先,创建一个抽象的直升机模型,该模型包含机身、螺旋桨以及位于机尾的尾桨。

二、直升机飞行原理

固定翼航空器的飞行升力源于固定在机身上的机翼。当固定翼航空器向前飞行时,机翼与空气发生相对运动,从而产生升力。直升机的升力产生原理与机翼类似,不过直升机的升力来自绕固定轴旋转的“旋翼”。与飞机依靠整个机体向前飞行使机翼与空气产生相对运动不同,直升机的旋翼依靠自身旋转产生与空气的相对运动。

然而,在旋翼提供升力的同时,直升机机身会因反扭矩(与驱动旋翼旋转等量但方向相反的扭矩,即反作用扭矩)的作用而有向反方向旋转的趋势。对于单旋翼直升机,为平衡反扭矩,常见做法是使用另一个小型旋翼,即尾桨,在机身尾部产生抵消反向运动的力矩。对于多旋翼直升机,则多采用旋翼之间反向旋转的方法来抵消反扭矩的作用。

三、简易飞行控制模型功能

本案例仅实现了一个简易的飞行控制模型,若要将该模型用于模拟飞行,可能难以满足需求。此飞行模型实现了机体的升降、前进与后退、左右侧飞、左右旋转,并且机身上的螺旋桨和尾桨都能旋转。具体的控制按键如下:

  • W键:前进
  • S键:后退
  • A键:左转弯
  • D键:右转弯
  • ↑方向键:上升
  • ↓方向键:下降
  • ←方向键:左侧飞
  • →方向键:右侧飞

四、实现控制的代码

using UnityEngine;
using System.Collections;

public class Handler : MonoBehaviour {
public GameObject helicopter;
public GameObject rotor01;
public GameObject rotor02;
public GameObject rotor03;

float curRotX = 0;
float curRotY = 0;
float curRotZ = 0;

// Use this for initialization
void Start () {
helicopter = GameObject.Find("Body");
rotor01 = GameObject.Find("Rotor01");
rotor02 = GameObject.Find("Rotor02");
rotor03 = GameObject.Find("Rotor03");
}

// Update is called once per frame
void FixedUpdate () {
// 螺旋桨旋转
rotor01.transform.Rotate(new Vector3(0, -10, 0));
rotor02.transform.Rotate(new Vector3(0, -10, 0));
rotor03.transform.Rotate(new Vector3(10, 0, 0));

if(Input.GetKey(KeyCode.W)) {
// 前进
helicopter.transform.Translate(Vector3.forward * Time.deltaTime * 5);
} else if(Input.GetKey(KeyCode.A)) {
// 左转弯
helicopter.transform.Rotate(new Vector3(0, -2, 0));
} else if(Input.GetKey(KeyCode.S)) {
// 后退
helicopter.transform.Translate(Vector3.forward * Time.deltaTime * -5);
} else if(Input.GetKey(KeyCode.D)) {
// 右转弯
helicopter.transform.Rotate(new Vector3(0, 2, 0));
} else if(Input.GetKey(KeyCode.UpArrow)) {
// 上升
helicopter.transform.Translate(0, 0.1f, 0);
} else if(Input.GetKey(KeyCode.DownArrow)) {
// 下降
helicopter.transform.Translate(0, -0.1f, 0);
} else if(Input.GetKey(KeyCode.LeftArrow)) {
// 左侧飞
helicopter.transform.Translate(-0.1f, 0, 0);
} else if(Input.GetKey(KeyCode.RightArrow)) {
// 右侧飞
helicopter.transform.Translate(0.1f, 0, 0);
}

if(Input.GetKeyUp(KeyCode.W)) {
// 松开W键的处理,此处原代码注释未启用功能
}
}
}

五、工程文件

以下是工程文件的链接:

作者信息

boke

boke

共发布了 1025 篇文章