用于在 OpenGL (GLUT) 中进一步开发的 Cessna Skyhawk 骨架






4.07/5 (10投票s)
使用 Win32 控制台在 OpenGL (GLUT) 中进一步开发的 Cessna Skyhawk 骨架
- 下载源代码 - 75.83 KB (Visual C++ 6.0 项目文件)

引言
我不想看到这段代码丢失。这段代码是一个灵活的塞斯纳 Skyhawk 模拟器骨架,但可以开发成一个完整的飞行模拟器。
它使用 OpenGL (GLUT) API,因此如果您尚未在系统上安装 GLUT,请访问 http://www.xmission.com/~nate/glut.html 下载最新的 GLUT 二进制文件。
如何安装 glut
- 解压缩 glut-3.7.6-bin.zip 归档文件的内容
- 将 glut.lib 复制到 \Microsoft Visual Studio\VCxx\Lib 目录
- 将 glut.h 复制到 \Microsoft Visual Studio\VCxx\Include\GL 目录
- 将 glut32.dll 复制到 \WINDOWS\system32 目录
项目文件是
cessna.cpp | 主文件 |
cessna.h | 塞斯纳头文件 |
draw.h | 绘制头文件 |
glm.h | glm.h 头文件 |
globals.h | 全局头文件 |
input.h | 输入头文件 |
materials.h | 材质头文件 |
polygons.h | 多边形头文件 |
render.h | 渲染头文件 |
splash.h | 启动画面头文件 |
vertices.h | 顶点输入头文件 |
控制方式
塞斯纳 Skyhawk 可以通过键盘或鼠标控制。
键盘控制如下
右键或 C | 右滚 |
左键或 Z | 左滚 |
上键或 S | 俯冲 |
下键或 X | 仰冲 |
1 | 从飞机后方观察外部视图,跟随飞机 |
2 | 从左侧观察外部视图 |
3 | 从右侧观察外部视图 |
4 | 从驾驶舱观察内部视图 |
+ | 增加螺旋桨转速 |
- | 降低螺旋桨转速 |
key() 函数
key()
函数是在窗口内按下和释放按键时的回调函数。
void key(unsigned char k, int xx, int yy)
{
kbCode=k;
switch(k)
{
case 27:
exit(0);
break;
case 'c':
theta[2] += 2.0; // roll right on c
break;
case 'z':
theta[2] -= 2.0; // roll left on z
break;
case 's':
theta[0] += 2.0; // pitch down on s
updownspeed -= 1;
break;
case 'x':
theta[0] -= 2.0; // pitch up on X
updownspeed += 1;
break;
case 'r':
reset();
break;
case 'q':
exit(1);
break;
case '+':
if (propvar < 2) propvar = 2; // sets propvar to 2 from 0
propvar +=10; // adds 10
break;
case '-':
propvar -=10; // decrease speed by 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;
}//switch
// checks to see if the plane has exceeded maximum pitch or roll
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();
}
鼠标控制如下
鼠标向右移动 |
右滚 |
鼠标向左移动 |
左滚 |
鼠标向上移动 |
俯冲 |
鼠标向下移动 |
仰冲 |
motion() 函数
motion()
函数是在鼠标在窗口内移动且未按下鼠标按钮时的回调函数。
int mouseX, mouseY; // mouse coordinates
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; // mouse moved
// to the right
else if ((mouseX - oldMouseX) < 0) theta[2] -= 4.0; // mouse moved
// to the left
if ((mouseY - oldMouseY) < 0)
{
theta[0] += 3.0; // pitch down on s
updownspeed -= 1;
}
else if ((mouseY - oldMouseY) > 0) // mouse moved to the left
{
theta[0] -= 3.0; // pitch up on X
updownspeed += 1;
}
}
}
这只是一个塞斯纳 Skyhawk 模拟器的骨架,但可以开发成一个完整的飞行模拟器。