基于OGRE的Boids算法实验
一、 实验内容
1.1 在OGRE中实现Boids算法,将OpenGL平台的MyBoids算法移植到OGRE中进行实现; 1.2 在OGRE中添加以下交互功能,通过按键或者菜单均可:
? 增加/减少Boids的速度;
? 启动/停止Cube的移动,观察Boids的跟随效果; ? 改变4个规则的权值(0-1之间),观察Boids的飞行效果;
二、 实验步骤
1.1实验步骤
1.拷贝MyBoids.h,MyBoids.cpp到E:\\MFCOgre1\\MFCOgre1(对应的项目位置) 2.添加MyBoids.h、MyBoids.cpp到工程中
3.在MFCOgre1View.h中引入头文件MyBoids.h(#include \
4.在MFCOgre1View.cpp的OnInitialUpdate()函数(OnInitialUpdate()在MFCOgre1View的第115行)中,添加函数AllInit();
5.打开MFCOgre1View.h,在类中创建节点变量SceneNode* node,实体变量Entity* ent,节点变量数组SceneNode* node4[BoidsNum],实体变量数组Entity* ent4[BoidsNum],字符串数组Ogre::String Name[BoidsNum]。
SceneNode* node; Entity* ent;
SceneNode* node4[BoidsNum]; Entity* ent4[BoidsNum]; Ogre::String Name[BoidsNum];
6.打开MFCOgre1View.cpp,在MFCOgre1View.cpp的构造函数中对创建的节点和实体对象以及字符串数组初始化
for(int i = 0; i< BoidsNum; i++) {
if(i == 0) {
Name[i] = \; } else {
Name[i] = Name[i-1] + \; } }
for(int i = 0; i< BoidsNum; i++ ) {
ent4[i] = NULL; }
for(int i = 0; i < BoidsNum; i++ ) {
node4[i] = NULL; }
7.在MFCOgre1View.cpp的CreateEntity函数中创建实体,并将实体绑定到节点上
ent = m_pSceneManager->createEntity(\, \);
node = m_pSceneManager->getRootSceneNode()->createChildSceneNode(\); node->setScale(0.1f,0.1f,0.1f);
node->setPosition(CubePosition[0],CubePosition[1],CubePosition[2]);
node->attachObject(ent);
ent->setMaterialName(\);
for(int i = 0; i < BoidsNum; i++) {
ent4[i] = m_pSceneManager->createEntity(Name[i],\);
node4[i] = m_pSceneManager->getRootSceneNode()->createChildSceneNode(Name[i]); node4[i]->setPosition(BoidsPosition[i][0],BoidsPosition[i][1],BoidsPosition[i][2]); node4[i]->attachObject(ent4[i]); node4[i]->setScale(0.05f,0.05f,0.05f);
ent4[i]->setMaterialName(\); }
8.在MFCOgre1View.cpp的OnTimer消息响应函数中添加CubMotion(), 设置节点的node的位置;添加
BoidsMotion(),设置节点数组node4[BoidsNum]的位置
CubeMotion();
node->setPosition(CubePosition[0],CubePosition[1],CubePosition[2]+40); BoidsMotion();
for(int i = 0;i node4[i]->setPosition(BoidsPosition[i][0],BoidsPosition[i][1],BoidsPosition[i][2]+40); } 9.生成项目 使用“生成项目”功能可以将程序的源代码文件编译为可执行的二进制文件,方法十分简单:在“生成”菜单中选择“生成解决方案”。 在项目生成过程中,“输出”窗口会实时显示生成的进度和结果。如果源代码中不包含语法错误,会在最后提示生成成功,如下图所示: 10执行项目 在MFCOgre1中选择“调试”菜单中的“开始执行(不调试)”,可以执行刚刚生成的程序,运行出实验要求的结果 实验结果如下截图: 最开始的结果中,一群飞翔的物体和cube表面都是白色的,没有材质显示,后来经过学姐指点,知道了是setMaterialName()函数中的材质在我的电脑的材质库中不存在,所以它不会显示。但是,我将材质名称改好后,依然不显示。后来才知道,是把材质文件名称和材质名称弄混淆了。材质的名称是在.material文件里面,并不是.material文件的名称。 1.2 实验步骤: 在OGRE中添加以下交互功能,通过按键或者菜单均可: