需要注意的是,DOF的命名不能采用默认名称,即d1 等名称。否则,不能依据DOF的名称查找到该DOF。在此例中,命名为turretDOF。其次,必须引入DOF 类的头文件为:#include "vsDOF.h"。
类视图如图6.19.1所示。上一节把坦克作为汽车的“孩子”加进了场景,本节将建立一个火焰特效,利用DOF 操作坦克的炮管和炮塔,运行实例VPTestDialogDOF,其效果如图6.19.2所示。
图6.19.1 DOF 类继承图
图6.19.2 效果图
首先,建立火焰特效,其具体代码如图6.19.3所示。
图6.19.3 建立火焰特效
坦克拥有两个DOF:一个为turretDOF,控制炮塔水平旋转;另一个为barrelDOF,控制炮管上下旋转。为了使场景更加逼真,把火焰特效放到炮管末端,在发射炮弹时,火焰特效发生作用。为了应用开发方便,需要定义3个静态变量:2个DOF,1个火焰特效。
static vsDOF * m_turret;//炮塔DOF 指针
static vsDOF * m_barrel;//炮管DOF 指针
static vpFxParticleSystem *m_mainGunFlash;//火焰特效指针
定义完成后,记得要初始化:
vsDOF * PublicMember::m_turret=NULL;
vsDOF * PublicMember::m_barrel=NULL;
vpFxParticleSystem *PublicMember::m_mainGunFlash=NULL;
操作DOF 之前,须先获得DOF 指针。而应用中的两个DOF 都在物体坦克上,则先应得到坦克的指针:
vpObject * tank=vpObject::find("m1_tank");
接着,获取坦克上的DOF:
//获取炮塔DOF
PublicMember::m_turret=static_cast<vsDOF *>(tank->find_named("turretDOF"));
PublicMember::m_turret->ref();
//获取炮管DOF
PublicMember::m_barrel=static_cast<vsDOF *>(tank->find_named("barrelDOF"));
PublicMember::m_barrel->ref();
炮管的上下旋转应该在一定范围之内,应该加上限制,才符合实际情况。在这里,限制炮管向下10°,向上25°。
//对炮管进行控制
vsDOF::Constraint constraint;(www.daowen.com)
constraint.m_enable=true;
constraint.m_min=-10.0;
constraint.m_max=25.0;
m_barrel->setConstraint(vsDOF::COMPONENT_ROTATE_P,constraint);
现在,建立一个转换,把火焰特效放到炮管的末端。其方法是让转换成为炮管的“孩子”,然后让火焰特效成为转换的“孩子”。
//创建一个转换,并且让转换成为炮管的“孩子”
vsTransform * m_mainGunTransform=new vsTransform();
m_mainGunTransform->setTranslate(0.14,3.22,0.0);
m_barrel->push_back_child(m_mainGunTransform);
//找到火焰特效,让火焰特效成为转换的“孩子”,这样就把火焰特效放到了炮管尾部
m_mainGunFlash=vpFxParticleSystem::find("maingunflash");
m_mainGunFlash->ref();
m_mainGunTransform->push_back_child(m_mainGunFlash);
详细代码位于主线程中,具体如图6.19.4所示。
图6.19.4 包含DOF 操作的主线程
主线程中的键盘函数需要进一步改造,定义了5个键:
(1)vrWindow::KEY_a:炮台左转;
(2)vrWindow::KEY_d:炮台右转;
(3)vrWindow::KEY_w:炮管向上;
(4)vrWindow::KEY_s:炮管向下;
(5)vrWindow::KEY_SPACE:发射炮弹。
具体的键盘函数如图6.19.5所示。
图6.19.5 键盘函数的一部分
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。