用于在 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 模拟器的骨架,但可以开发成一个完整的飞行模拟器。


