65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.07/5 (10投票s)

2010 年 5 月 28 日

CPOL

2分钟阅读

viewsIcon

40613

downloadIcon

2392

使用 Win32 控制台在 OpenGL (GLUT) 中进一步开发的 Cessna Skyhawk 骨架

引言

我不想看到这段代码丢失。这段代码是一个灵活的塞斯纳 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 模拟器的骨架,但可以开发成一个完整的飞行模拟器。

© . All rights reserved.