The Flight module provides programmers with a method of simulating flight that is both accurate and easy to operate. The module allows programmers to create landable aircraft, including tail-dragger airplanes. The module also contains several useful subroutines.
There are currently two of this module, which are all available in the jsm directory of our GitHub repository:
| * Flight4 | - | Used to create the flight simulation demo for airplanes. |
| * FlightH | - | Used to create the flight simulation demo for helicopters. |
At the beginning of the program, prior to the importmap, you can load the airplane data using the following command:
< script src="https://PhilCrowther.github.io/Aviation/models/fm2/data/data.js"></script>After the importmap, you can import the Flight4 module using the following command:
import {Flight,Mod360,PoM360,MaxVal,rotLLD,makMsh} from "https://PhilCrowther.github.io/Aviation/jsm/Flight4.js";
The Flight4 module uses the following variables to store data.
//- Starting Values
let BegPwr = 0; // Initial Power Percent
let BegSpd = 0; // Speed (kph)
let BegPos = new THREE.Vector3(0,0,0); // Position (m)
//- Constants
let DLTime = 1/60; // Delta Time (1/60 seconds)
let GrvMPS = 9.80665; // Gravity (mps)
let AirDSL = 1.225; // Density - Sea Level (kg/m3)
//- Variables
let flight = 0;
let air_ = {
// General Variables
DLTime: DLTime, // Seconds per frame (can vary)
GrvMPS: GrvMPS, // Gravity (ups)
AirDSL: AirDSL, // Air Density (varies with altitude)
// Designators
AirDat: data_, // Aircraft Data
// Airplane Rotation: Vertical Angle, Horizontal Angle, Bank Angle
AirRot: new THREE.Vector3(0,0,0), // Rotation (in degrees)
AirObj: makMsh(), // Airplane Object
AirPBY: makMsh(), // Changes in radians
// Changes to Airplane Pitch Bank and Yaw
RotDif: new THREE.Vector3(0,0,0), // Change
// Airplane Speed
SpdKPH: BegSpd, // Speed in KPH
SpdMPS: BegSpd/3.6, // Speed - meters per second
SpdMPF: (BegSpd/3.6)*DLTime, // Speed - meters per frame
// Airplane Map Speed and Position
MapSpd: new THREE.Vector3(), // Map Speed (meters)
MapPos: new THREE.Vector3().copy(BegPos), // Map Position (meters)
MapSPS: new THREE.Vector3(0,BegPos.y,0), // MSX, MPY, MSZ (meters)
// Variables Obtained from Flight
PwrPct: BegPwr, // % of Primary Power (0 to 1) (Main and Flight)
SupPct: 0, // Percent of Supplemental Power (War Enmergency or Afterburner)
CfLift: 0, // Coefficient of Lift (user input) - determines lift
CfFlap: 0, // Coefficient of Lift due to flaps (user input)
FlpPct: 0, // Percent of Flaps
LngPct: 0, // Percent of Landing Gear
BrkPct: 0, // Percent of Air Brakes
SplPct: 0, // Percent of Spoiler
AGBank: 0, // Aileron Bank on Ground
BrkVal: 0, // Brakes
GrdZed: 0, // Ground level (default)
GrdFlg: 0, // Ground Flag (1 = on ground)
ACPAdj: 0, // Airplane pitch adjustment
MovFlg: 0, // If Sitting on a Moving Object
// Values for the Selected Airplane Type (obtained from Flight)
CfLMax: 0, // Maximum Coefficient of Lift
FlpCfL: 0, // Max Flap Cfl (0.2*CfLMax)
ACMass: 0, // Airplane Mass
Weight: 0, // Used by AutoPilot
PYBmul: new THREE.Vector3(0,0,0), // Airplane Pitch/Yaw/Bank Multiplier
BnkMax: 0, // Maximum bank rate
// AutoPilot - Additional Variables
AutoOn: 0, // Autopilot Flag
InpKey: new THREE.Vector3(), // Inputs - Keys (replace InpKey)
OldRot: new THREE.Vector3(), // Old Rotation (radians)
CfLDif: 0, // Change in CfL
MaxBnk: 0, // Max Bank (display only)
HdgDif: 0 // Horizontal Turn Rate (display only)
}
// Adjustments
air_.AirObj.rotation.order = "YXZ";
air_.AirPBY.rotation.order = "YXZ";
air_.AirObj.add(air_.AirPBY); // PBY includes air_.ACPAdj
flight = new Flight(air_);
flight.update();
Here are some additional discussions of the Flight Module:
| Theory | - Animated examples show the underlying theory. | |
|---|---|---|
| Programmer Guide | - A Guide for Programmers. | |
| Computations | - The Flight computations. | |
| Validating | - Validating your aircraft performance. |