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

使用 OpenGL 进行目标跟踪控制

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.47/5 (7投票s)

2010年3月25日

CPOL

1分钟阅读

viewsIcon

42640

downloadIcon

1869

一个简单的目标控制,用于显示敌人的方向,尤其适用于电脑游戏。

引言

附带 C++ 项目中实现的目标跟随控制是一种简单的方法,用于跟随已知的目标,尤其是在目标超出视野范围时。

背景 

许多 3D 游戏都实现了这种控制,但描述这种目标跟随方法的文章仍然很少。

Using the Code

为了证明这个概念,实现了一个简单的相机模型。我们使用一个简单的立方体作为目标进行跟随。

Ionut_Iorgovan/example1.jpg

图片描述:显示了应用程序的屏幕截图。白色立方体代表目标,黑色点代表目标跟随控制。

对于实际的方法,我们获得将世界坐标系转换到相机坐标系的矩阵。可以使用 OpenGL 命令计算该矩阵。

glGetFloatv(GL_MODELVIEW_MATRIX, Matrix)  

然后,我们将此矩阵与目标的坐标相乘,并获得目标在相机空间中的坐标,即 2D 坐标。

TargetPosition[0] = Position[0]*Matrix[0]+Position[1] * 
			Matrix[4] + Position[2] * Matrix[8] + 1.0f * Matrix[12];
TargetPosition[1] = Position[0]*Matrix[1]+Position[1] * 
			Matrix[5] + Position[2] * Matrix[9] + 1.0f * Matrix[13];
TargetPosition[2] = Position[0]*Matrix[2]+Position[1]* 
			Matrix[6] + Position[2] * Matrix[10] + 1.0f * Matrix[14]; 

为了在屏幕边缘附近显示目标点,我们进行一些简单的几何计算,以确定屏幕矩形框架与目标之间的交点。

为了实际显示跟随目标,我们从 3D 模式切换到 2D 模式,并使用 OpenGL GL_POINTS 来指示目标的朝向。

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0, 500, 500, 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glTranslatef(250, 250, 0.0);
glPointSize(10.0f);
glBegin(GL_POINTS);
glVertex2f((IPoint[1] -250)/1.1, (-IPoint[0] +250)/1.1);
glEnd();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();  

关注点

这种方法的实现非常简单,它需要将 2D 和 3D 模式与 OpenGL 结合起来。

为了控制相机移动,使用以下按键

  • w, s: 放大和缩小
  • q, z: 上下移动
  • a, d: 左侧和右侧移动

历史

在第一次实现中,我使用了简单的圆形目标定位。此实现包含在源代码中,但当前已注释掉。

Ionut_Iorgovan/example2.jpg
© . All rights reserved.