坦克模拟器






2.27/5 (25投票s)
它模拟基于车辆动力学的坦克。

引言
坦克模拟器是一个软件工具,用于模拟基于其车辆动力学的坦克。车辆动力学允许模拟包含最能近似车辆动态性能的参数。坦克模拟器仍在开发中,目前仅模拟少数车辆参数,如重量、尺寸、速度、悬挂和制动效果。完整版本将包含所有车辆参数,并展现履带与地形的交互。开发活动使用一种名为 Open Dynamics Engine (ODE) 的计算引擎,该引擎是模拟铰接体的工业标准库。它提供交互式或实时模拟。模拟器的 3D 视觉环境使用与 ODE 一起打包的图形库。已向该库添加了适合应用程序需求的函数。完整的软件以集成环境的形式打包在 Visual C++ 中。
总体系统架构
界面和图形模块:这些模块与 ODE 一起打包,名为 drawstuff。它基本上是一个图形库,提供模拟地形、提供相机视图等功能。该库已自定义用于绘制 3D 坦克部件 - 轮子、惰轮、链轮、底盘、链条和炮塔,以及模拟器的其他视觉需求。
模拟模块:此模块负责执行模拟代码,其中包括创建动态世界、使用关节集成坦克车身部件、处理碰撞、控制坦克行为、迭代模拟循环以及最终销毁动态世界。此模块是使用 Open Dynamic Engine (ODE) 构建的。
工作原理
坦克模拟器的图形部分是使用 OpenGL 开发的。但是,我将只解释使用 ODE 的模拟部分。对于 ODE 来说,有两件事非常重要 - 刚体和关节。坦克是由底盘、轮子、炮塔、链条等部件组成的。这些部件首先在图形上绘制,然后提供刚体属性,这些属性可以具有质量并显示碰撞属性。然后使用 ODE 中提供的各种类型的关节将这些刚体连接在一起,以形成一个完整的坦克。现在,坦克不仅仅是屏幕上的 3D 图形,而是具有物理特性的车辆。这是显示它的一部分代码
//simulation loop
static void simLoop (int pause)
{
.
.
.
dSpaceCollide (space,0,&nearCallback); //checks for collision
dWorldSetQuickStepNumIterations (world,85);
dWorldQuickStep (world,0.05); //advance the simulation
//chassis body
dsDrawTankBody(dBodyGetPosition(ChassisBody[0]),dBodyGetRotation(ChassisBody[0]),sides);
//turret body
dsDrawTurret(dBodyGetPosition(TurretBody[0]),dBodyGetRotation(TurretBody[0]),sides);
.
.
.
}
//main function
int main (int argc, char **argv)
{
.
.
.
dMass m; //mass variable
// setup pointers to drawstuff callback functions
dsFunctions fn;
.
.
fn.step = &simLoop; //call for simulation loop
.
// create world
world = dWorldCreate();
space = dHashSpaceCreate (0); //creates space for bodies
contactgroup = dJointGroupCreate (0);
dWorldSetGravity(world, 0,0,GRAVITY); //sets gravity 9.81
ground = dCreatePlane (space,0,0,1,0); //forms ground
// chassis body
ChassisBody[0] = dBodyCreate (world);
dBodySetPosition (ChassisBody[0],0,0,STARTZ);
dMassSetBox (&m,1,LENGTH,WIDTH,HEIGHT);
dMassAdjust (&m,CMASS);
dBodySetMass (ChassisBody[0],&m);
ChassisBox[0] = dCreateBox (0,LENGTH,WIDTH,HEIGHT);
dGeomSetBody (ChassisBox[0],ChassisBody[0]);
.
.
//chassis -turretjoint
TurretJoint[0] = dJointCreateHinge (world,0); //creates hinge joint
dJointAttach (TurretJoint[0],ChassisBody[0],TurretBody[0]); //attaches joint
const dReal *a1 = dBodyGetPosition (TurretBody[0]);
dJointSetHingeAnchor (TurretJoint[0],a1[0],a1[1],a1[2]);
dJointSetHingeAxis (TurretJoint[0],0,0,1);
dJointSetHingeParam (TurretJoint[0],dParamLoStop,0);
dJointSetHingeParam (TurretJoint[0],dParamHiStop,0);
dJointSetHingeParam (TurretJoint[0],dParamSuspensionERP,ERP);
.
.
.
}
模拟模块是基于 ODE 中给出的一个模拟算法开发的。请参阅 ODE 用户指南了解此内容。该算法从创建一个进行模拟的动态世界开始,然后向其中添加刚体,赋予刚体参数,然后连接这些刚体以形成车辆,稍后调用碰撞处理程序以确定与模拟环境中其他物体的任何碰撞,最后销毁世界。主函数正是解释了这一点。使用dWorldCreate
,我们创建一个动态世界,然后赋予这个世界一个 9.81 的重力。我们在坦克移动的地方创建一个平面。使用dBodyCreate
,我们创建刚体,通过dBodySetPosition
设置其位置,通过dBodySetMass
设置其质量,然后将此刚体与我们使用dGeomSetBody
创建的几何图形相关联。ODE 支持各种类型的关节,如铰接关节、滑块关节等。dJointCreateHinge
创建一个铰接关节。关节通过dJointAttach
连接在两个刚体之间。其他函数已被用于设置关节的各种参数。一旦创建了动态世界、刚体和关节以形成车辆,就会调用模拟循环simLoop
。此模拟循环的基本功能是检查是否有任何碰撞,然后通过其步长推进模拟。
参考文献
- Russell Smith 编写的 Open Dynamics Engine v0.5 用户指南。
- http://www.sourceforge.net 提供了 ODE 的 CVS 存储库和一些 ODE 示例。
- 您可以参考 Corina Sandu 和 Jeffrey S. Freeman 撰写的《重型车辆系统》,第 9 卷,2002 年 11 月 2 日,了解坦克车辆动力学。
我已在源代码中包含了一个自述文件,其中包含在您的系统上设置 ODE 的说明。除此之外,我包含了三个源代码文件夹,这些文件夹显示了模拟器在不同开发阶段的情况。我目前正在开发坦克的履带地形交互。