[图文教程] Unity3D简易直升机飞行控制
有朋友询问如何在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键的处理,此处原代码注释未启用功能
}
}
}
五、工程文件
以下是工程文件的链接: