这段时间很忙,各种麻烦事弄得头晕脑胀,突然发现已经很久没在论坛上发布教程。这段时间也收到许多朋友的来信,有的朋友问到如何实现一个直升机飞行控制,就这个问题我写了一个简化的直升机飞行控制案例。
创建抽象的直升机模型,其中包括机身,螺旋桨和位于机尾的尾桨。
直升机的飞行原理如下:
固定翼航空器的飞行升力源自固定在机身上的机翼。当固定翼航空器向前飞时,机翼与空气之间发生相对运动,进而产生升力。直升机的升力产生原理与机翼相似, 只不过这个升力是来自于绕固定轴旋转的“旋翼”。旋翼不像飞机那样依靠整个机体向前飛行來使机翼與空氣产生相對運動,而是依靠自身旋转产生與空氣的相對運 動。但是,在旋翼提供升力的同时,直升机机身也会因反扭矩(与驱动旋翼旋转等量但方向相反的扭矩,即反作用扭矩)的作用而具有向反方向旋转的趋势。对于单 旋翼直升机,为了平衡反扭矩,常见的做法是以另一个小型旋翼,即尾桨,在机身尾部产生抵消反向运动的力矩。对于多旋翼直升机,多采用旋翼之间反向旋转的方 法来抵消反扭矩的作用。
案例中我只实现了一个简易的飞行控制模型,如果大家想把这个模型用于模拟飞行恐怕就难以胜任了。这个飞行模型实现了机体的升降、前进与后退、左右侧飞、左右旋转,机身上的螺旋桨和尾桨都能旋转。
W键:前进
S键:后退
A键:左转弯
D键:右转弯
↑方向键:上升
↓方向键:下降
←方向键:左侧飞
→方向键:右侧飞
飞行中的直升机模型
飞行中的直升机模型
下面是实现控制的代码:
创建抽象的直升机模型,其中包括机身,螺旋桨和位于机尾的尾桨。
直升机的飞行原理如下:
固定翼航空器的飞行升力源自固定在机身上的机翼。当固定翼航空器向前飞时,机翼与空气之间发生相对运动,进而产生升力。直升机的升力产生原理与机翼相似, 只不过这个升力是来自于绕固定轴旋转的“旋翼”。旋翼不像飞机那样依靠整个机体向前飛行來使机翼與空氣产生相對運動,而是依靠自身旋转产生與空氣的相對運 動。但是,在旋翼提供升力的同时,直升机机身也会因反扭矩(与驱动旋翼旋转等量但方向相反的扭矩,即反作用扭矩)的作用而具有向反方向旋转的趋势。对于单 旋翼直升机,为了平衡反扭矩,常见的做法是以另一个小型旋翼,即尾桨,在机身尾部产生抵消反向运动的力矩。对于多旋翼直升机,多采用旋翼之间反向旋转的方 法来抵消反扭矩的作用。
案例中我只实现了一个简易的飞行控制模型,如果大家想把这个模型用于模拟飞行恐怕就难以胜任了。这个飞行模型实现了机体的升降、前进与后退、左右侧飞、左右旋转,机身上的螺旋桨和尾桨都能旋转。
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((float)0, (float)-10, (float)0));
-
rotor02.transform.Rotate(new Vector3((float)0, (float)-10, (float)0));
-
rotor03.transform.Rotate(new Vector3((float)10, (float)0, (float)0));
-
-
if(Input.GetKey(KeyCode.W))
-
{
-
//float angleY = helicopter.transform.RotateAround(new Vector3(1f,0f,0f), 15);
-
-
//helicopter.transform.Translate((float)0.0,(float)0.06,(float)0.0);
-
//helicopter.transform.rotation = Quaternion.Euler(new Vector3((float)15,curRotY,curRotZ));
-
-
//helicopter.transform.localRotation = Quaternion.Euler(new Vector3((float)15,curRotY,curRotZ));
-
-
helicopter.transform.Translate(Vector3.forward * Time.deltaTime * 5);
-
-
-
//helicopter.transform.Translate((float)0.0,(float)0.0268,(float)0.0);
-
-
-
}
-
else if(Input.GetKey(KeyCode.A))
-
{
-
-
helicopter.transform.Rotate(new Vector3((float)0, (float)-2, (float)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((float)0, (float)2, (float)0));
-
-
}
-
else if(Input.GetKey(KeyCode.UpArrow))
-
{
-
helicopter.transform.Translate((float)0.0,(float)0.1,(float)0.0);
-
}
-
else if(Input.GetKey(KeyCode.DownArrow))
-
{
-
helicopter.transform.Translate((float)0.0,(float)-0.1,(float)0.0);
-
}
-
else if(Input.GetKey(KeyCode.LeftArrow))
-
{
-
helicopter.transform.Translate((float)-0.1,(float)0.0,(float)0.0);
-
}
-
else if(Input.GetKey(KeyCode.RightArrow))
-
{
-
helicopter.transform.Translate((float)0.1,(float)0.0,(float)0.0);
-
}
-
-
if(Input.GetKeyUp(KeyCode.W))
-
{
-
-
//helicopter.transform.rotation = Quaternion.Euler(new Vector3((float)0.0, this.curRotY, this.curRotZ));
-