Introduction
I would hate to see this code go lost. The code in question is a flexible skeleton for a Cessna Skyhawk simulation, but can be developed into a fullfledged flight simulator.
It uses the OpenGL (GLUT) API so if you do not already have GLUT installed on your system, visit http://www.xmission.com/~nate/glut.html to download the latest GLUT binaries.
How to Install glut
- Unpack the contents of the archive glut-3.7.6-bin.zip
- Copy glut.lib to the \Microsoft Visual Studio\VCxx\Lib directory
- Copy glut.h to the \Microsoft Visual Studio\VCxx\Include\GL directory
- Copy glut32.dll to the \WINDOWS\system32 directory
The project files are:
| cessna.cpp |
The main file |
| cessna.h |
The cessna header file |
| draw.h |
The draw header file |
| glm.h |
The glm.h header file |
| globals.h |
The globals header file |
| input.h |
The input header file |
| materials.h |
The materials header file |
| polygons.h |
The polygons header file |
| render.h |
The render header file |
| splash.h |
The splash header file |
| vertices.h |
The vertices input header file |
The Controls
The Cessna Skyhawk is controlled by either keyboard or mouse.
The Keyboard controls are:
| RIGHT KEY or C |
roll right |
| LEFT KEY or Z |
roll left |
| UP KEY or S |
pitch down |
| DOWN KEY or X |
pitch up |
| 1 |
External view from behind, follow aircraft |
| 2 |
External view from left side |
| 3 |
External view from right side |
| 4 |
Internal view from cockpit |
| + |
Increase propeller speed |
| - |
Decrease propeller speed |
The key() Function
The key() function is a callback for when the key is pressed and released within the window.
void key(unsigned char k, int xx, int yy)
{
kbCode=k;
switch(k)
{
case 27:
exit(0);
break;
case 'c':
theta[2] += 2.0; break;
case 'z':
theta[2] -= 2.0; break;
case 's':
theta[0] += 2.0; updownspeed -= 1;
break;
case 'x':
theta[0] -= 2.0; updownspeed += 1;
break;
case 'r':
reset();
break;
case 'q':
exit(1);
break;
case '+':
if (propvar < 2) propvar = 2; propvar +=10;
break;
case '-':
propvar -=10; if (propvar < 0){propvar = 0; reset(); }
break;
case '1':
floatcamera = 0;
insidecamera = 0;
eyex = 0.0;
eyey = 110.0;
eyez = -550.0;
atx = 0.0;
aty = 0.0;
atz = 0.0;
upx = 0.0;
upy = 1.0;
upz = 0.0;
break;
case '2':
floatcamera = 0;
insidecamera = 0;
eyex = 500.0;
eyey = 1.0;
eyez = 0.0;
atx = 0.0;
aty = 0.0;
atz = 0.0;
upy = 1.0;
upz = 0.0;
break;
case '3':
floatcamera = 0;
insidecamera = 0;
eyex = -500.0;
eyey = 1.0;
eyez = 0.0;
atx = 0.0;
aty = 0.0;
atz = 0.0;
upy = 1.0;
upz = 0.0;
break;
case '4':
insidecamera = 1;
eyex = 0.0;
eyey = 22.0;
eyez = 35.0;
atx = 0.0;
aty = 22.0;
atz = 100.0;
upy = 1.0;
upz = 0.0;
break;
case '5':
floatcamera = 1;
break;
case '6':
floatcamera = 0;
insidecamera = 0;
eyex = 0.0;
eyey = 500.0;
eyez = -650.0;
atx = 0.0;
aty = 0.0;
atz = 0.0;
upy = 1.0;
upz = 0.0;
break;
case 'j':
eyex -= 10;
break;
case 'l':
eyex += 10;
break;
case 'i':
eyey += 10;
break;
case 'k':
eyey -= 10;
break;
case 'u':
eyez += 10;
break;
case 'n':
atx += 10;
break;
case 'm':
atx -= 10;
break;
}
if( theta[0] > 360.0 ) theta[0] -= 360.0;
if( theta[0] < -360.0 ) theta[0] += 360.0;
if( theta[2] > 360.0 ) theta[2] -= 360.0;
if( theta[2] < -360.0 ) theta[2] += 360.0;
glutPostRedisplay();
}
The mouse controls are:
MOUSE MOVE RIGHT |
roll right |
MOUSE MOVE LEFT |
roll left |
MOUSE MOVE UP |
pitch down |
MOUSE MOVE DOWN |
pitch up |
The motion() Function
The motion() function is a callback for when the mouse moves within the window while no mouse buttons are pressed.
int mouseX, mouseY; int oldMouseX, oldMouseY;
void motion(int x, int y)
{
oldMouseX = mouseX;
oldMouseY = mouseY;
mouseX = x;
mouseY = y;
if (speed>0)
{
if ((mouseX - oldMouseX) > 0) theta[2] += 4.0; else if ((mouseX - oldMouseX) < 0) theta[2] -= 4.0; if ((mouseY - oldMouseY) < 0)
{
theta[0] += 3.0; updownspeed -= 1;
}
else if ((mouseY - oldMouseY) > 0) {
theta[0] -= 3.0; updownspeed += 1;
}
}
}
This is only a skeleton for a Cessna Skyhawk simulation, but can be developed into a fullfledged flight simulator.