自己创建scene manager,载入bsp地图
class MyApplication :public ExampleApplication
{
public:
MyApplication() {}
~MyApplication()
{
}
void createScene()
{
std::cout<<mSceneMgr->getTypeName()<<"::"<<mSceneMgr->getName()<<std::endl;
}
virtual void chooseSceneManager()
{
ResourceGroupManager::getSingleton().addResourceLocation("http://www.cnblogs.com/media/packs/chiropteraDM.pk3",
"Zip", ResourceGroupManager::getSingleton().getWorldResourceGroupName(), true);
// index all files in the resource group which are not already indexed, of course we
// should give the name of the resource group we want to index.
ResourceGroupManager::getSingleton().initialiseResourceGroup(ResourceGroupManager::getSingleton().getWorldResourceGroupName());
// create a bsp scene manager
// BspSceneManager : identifying a unique SceneManager type
mSceneMgr = mRoot->createSceneManager("BspSceneManager");
// tell the bsp scene manager to load a map saved in the bsp file format
mSceneMgr->setWorldGeometry("maps/chiropteradm.bsp");
}
private:
};
int main()
{
MyApplication app;
app.go();
return 0;
}
用quad加材质图画草
class MyApplication :public ExampleApplication
{
public:
MyApplication() {}
~MyApplication()
{}
void createScene()
{
// 先用定义的平面创建一个网格,再用创建的网格构造一个实体
Ogre::Plane plane(Ogre::Vector3::UNIT_Y, -10);
Ogre::MeshManager::getSingleton().createPlane("plane",
ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
plane,
1500, 1500, 200, 200,
true, 1, 5, 5, Ogre::Vector3::UNIT_Z);
Ogre::Entity* entity = mSceneMgr->createEntity("grasspalne", "plane");
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(entity);
// 设置材质
entity->setMaterialName("Examples/GrassFloor");
// 创建方向光
Ogre::Light* light = mSceneMgr->createLight("light1");
light->setType(Ogre::Light::LT_DIRECTIONAL);
light->setDirection(Ogre::Vector3(1, -1, 0));
// 用manual object 绘制自己定义的物体
Ogre::ManualObject* manual = mSceneMgr->createManualObject("grass");
// param1--渲染manual object用到的材质(纹理)图
// param2--顶点的格式
manual->begin("Examples/GrassBlades", RenderOperation::OT_TRIANGLE_LIST);
manual->position(5.0, 10.0, 0.0);
manual->textureCoord(1, 0);
manual->position(-5.0, -10.0, 0.0);
manual->textureCoord(0, 1);
manual->position(-5.0, 10.0, 0.0);
manual->textureCoord(0, 0);
// second triangle
manual->position(5.0, -10.0, 0.0);
manual->textureCoord(1, 1);
manual->position(5.0, 10.0, 0.0);
manual->textureCoord(1, 0);
manual->position(-5.0, -10.0, 0.0);
manual->textureCoord(0, 1);
manual->end();
Ogre::SceneNode* grassNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("grassnode2");
grassNode->attachObject(manual);
}
};
画三个quad的草,每个quad之间夹角为60度
class MyApplication :public ExampleApplication
{
public:
MyApplication() {}
~MyApplication()
{}
void createScene()
{
// 先用定义的平面创建一个网格,再用创建的网格构造一个实体
Ogre::Plane plane(Ogre::Vector3::UNIT_Y, -10);
Ogre::MeshManager::getSingleton().createPlane("plane",
ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
plane,
1500, 1500, 200, 200,
true, 1, 5, 5, Ogre::Vector3::UNIT_Z);
Ogre::Entity* entity = mSceneMgr->createEntity("grasspalne", "plane");
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(entity);
// 设置材质
entity->setMaterialName("Examples/GrassFloor");
// 创建方向光
Ogre::Light* light = mSceneMgr->createLight("light1");
light->setType(Ogre::Light::LT_DIRECTIONAL);
light->setDirection(Ogre::Vector3(1, -1, 0));
// 用manual object 绘制自己定义的物体
Ogre::ManualObject* manual = mSceneMgr->createManualObject("grass");
// param1--渲染manual object用到的材质(纹理)图
// param2--顶点的格式
manual->begin("Examples/GrassBlades", RenderOperation::OT_TRIANGLE_LIST);
// first triangle
manual->position(5.0, 10.0, 0.0);
manual->textureCoord(1, 0);
manual->position(-5.0, 0.0, 0.0);
manual->textureCoord(0, 1);
manual->position(-5.0, 10.0, 0.0);
manual->textureCoord(0, 0);
// second triangle
manual->position(5.0, 0.0, 0.0);
manual->textureCoord(1, 1);
manual->position(5.0, 10.0, 0.0);
manual->textureCoord(1, 0);
manual->position(-5.0, 0.0, 0.0);
manual->textureCoord(0, 1);
// third triangle
manual->position(2.5, 0.0, 4.3);
manual->textureCoord(1, 1);
manual->position(-2.5, 10.0, -4.3);
manual->textureCoord(0, 0);
manual->position(-2.5, 0.0, -4.3);
manual->textureCoord(0, 1);
// fourth triangle
manual->position(2.5, 0.0, 4.3);
manual->textureCoord(1, 1);
manual->position(2.5, 10.0, 4.3);
manual->textureCoord(1, 0);
manual->position(-2.5, 10.0, -4.3);
manual->textureCoord(0 ,0);
//fifth triangle
manual->position(2.5, 0.0, -4.3);
manual->textureCoord(1 ,1);
manual->position(-2.5, 10.0, 4.3);
manual->textureCoord(0, 0);
manual->position(-2.5, 0.0, 4.3);
manual->textureCoord(0, 1);
//sixth triangle
manual->position(2.5, 0.0, -4.3);
manual->textureCoord(1, 1);
manual->position(-2.5, 10.0 ,4.3);
manual->textureCoord(0, 0);
manual->position(2.5, 10.0, -4.3);
manual->textureCoord(1, 0);
manual->end();
Ogre::SceneNode* grassNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("grassnode2");
grassNode->attachObject(manual);
}
};
画50*50的草
1 class MyApplication :public ExampleApplication
2 {
3 public:
4 MyApplication() {}
5 ~MyApplication()
6 {}
7
8 void createScene()
9 {
10 // 先用定义的平面创建一个网格,再用创建的网格构造一个实体
11 Ogre::Plane plane(Ogre::Vector3::UNIT_Y, -10);
12 Ogre::MeshManager::getSingleton().createPlane("plane",
13 ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
14 plane,
15 1500, 1500, 200, 200,
16 true, 1, 5, 5, Ogre::Vector3::UNIT_Z);
17 Ogre::Entity* entity = mSceneMgr->createEntity("grasspalne", "plane");
18 mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(entity);
19 // 设置材质
20 entity->setMaterialName("Examples/GrassFloor");
21 // 创建方向光
22 Ogre::Light* light = mSceneMgr->createLight("light1");
23 light->setType(Ogre::Light::LT_DIRECTIONAL);
24 light->setDirection(Ogre::Vector3(1, -1, 0));
25
26 // 用manual object 绘制自己定义的物体
27 Ogre::ManualObject* manual = mSceneMgr->createManualObject("grass");
28 // param1--渲染manual object用到的材质(纹理)图
29 // param2--顶点的格式
30 manual->begin("Examples/GrassBlades", RenderOperation::OT_TRIANGLE_LIST);
31
32
33 // first triangle
34 manual->position(5.0, 10.0, 0.0);
35 manual->textureCoord(1, 0);
36 manual->position(-5.0, 0.0, 0.0);
37 manual->textureCoord(0, 1);
38 manual->position(-5.0, 10.0, 0.0);
39 manual->textureCoord(0, 0);
40 // second triangle
41 manual->position(5.0, 0.0, 0.0);
42 manual->textureCoord(1, 1);
43 manual->position(5.0, 10.0, 0.0);
44 manual->textureCoord(1, 0);
45 manual->position(-5.0, 0.0, 0.0);
46 manual->textureCoord(0, 1);
47
48 // third triangle
49 manual->position(2.5, 0.0, 4.3);
50 manual->textureCoord(1, 1);
51 manual->position(-2.5, 10.0, -4.3);
52 manual->textureCoord(0, 0);
53 manual->position(-2.5, 0.0, -4.3);
54 manual->textureCoord(0, 1);
55 // fourth triangle
56 manual->position(2.5, 0.0, 4.3);
57 manual->textureCoord(1, 1);
58 manual->position(2.5, 10.0, 4.3);
59 manual->textureCoord(1, 0);
60 manual->position(-2.5, 10.0, -4.3);
61 manual->textureCoord(0 ,0);
62
63 //fifth triangle
64 manual->position(2.5, 0.0, -4.3);
65 manual->textureCoord(1 ,1);
66 manual->position(-2.5, 10.0, 4.3);
67 manual->textureCoord(0, 0);
68 manual->position(-2.5, 0.0, 4.3);
69 manual->textureCoord(0, 1);
70 //sixth triangle
71 manual->position(2.5, 0.0, -4.3);
72 manual->textureCoord(1, 1);
73 manual->position(-2.5, 10.0 ,4.3);
74 manual->textureCoord(0, 0);
75 manual->position(2.5, 10.0, -4.3);
76 manual->textureCoord(1, 0);
77
78 manual->end();
79
80 //Ogre::SceneNode* grassNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("grassnode2");
81 //grassNode->attachObject(manual);
82
83 //Convert this object to a Mesh
84 manual->convertToMesh("BladeOfGrass");
85 std::stringstream os;
86 for (int i=0 ;i<50; ++i)
87 {
88 for (int j=0; j<50; ++j)
89 {
90 os<<i<<j;
91 Ogre::Entity* ent = mSceneMgr->createEntity(os.str(), "BladeOfGrass");
92 Ogre::SceneNode* node = mSceneMgr->getRootSceneNode()->createChildSceneNode(
93 os.str(), Ogre::Vector3(i * 3, -10, j * 3));
94 node->attachObject(ent);
95 }
96 }
97 }
98 };
用索引列表表示三角形+StaticGeometry 提高渲染效率
class MyApplication :public ExampleApplication
{
public:
MyApplication() {}
~MyApplication()
{}
void createScene()
{
// 先用定义的平面创建一个网格,再用创建的网格构造一个实体
Ogre::Plane plane(Ogre::Vector3::UNIT_Y, -10);
Ogre::MeshManager::getSingleton().createPlane("plane",
ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
plane,
1500, 1500, 200, 200,
true, 1, 5, 5, Ogre::Vector3::UNIT_Z);
Ogre::Entity* entity = mSceneMgr->createEntity("grasspalne", "plane");
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(entity);
// 设置材质
entity->setMaterialName("Examples/GrassFloor");
// 创建方向光
Ogre::Light* light = mSceneMgr->createLight("light1");
light->setType(Ogre::Light::LT_DIRECTIONAL);
light->setDirection(Ogre::Vector3(1, -1, 0));
// 用manual object 绘制自己定义的物体
Ogre::ManualObject* manual = mSceneMgr->createManualObject("grass");
// param1--渲染manual object用到的材质(纹理)图
// param2--顶点的格式
manual->begin("Examples/GrassBlades", RenderOperation::OT_TRIANGLE_LIST);
// first triangle
manual->position(5.0, 10.0, 0.0); // indice = 0
manual->textureCoord(1, 0);
manual->position(-5.0, 0.0, 0.0); // indice = 1
manual->textureCoord(0, 1);
manual->position(-5.0, 10.0, 0.0); // indice =2
manual->textureCoord(0, 0);
// second triangle
manual->position(5.0, 0.0, 0.0); //indice = 3
manual->textureCoord(1, 1);
//manual->position(5.0, 10.0, 0.0);
//manual->textureCoord(1, 0);
//manual->position(-5.0, 0.0, 0.0);
//manual->textureCoord(0, 1);
// third triangle
manual->position(2.5, 0.0, 4.3); //indice=4
manual->textureCoord(1, 1);
manual->position(-2.5, 10.0, -4.3); //indice=5
manual->textureCoord(0, 0);
manual->position(-2.5, 0.0, -4.3); //indice=6
manual->textureCoord(0, 1);
// fourth triangle
//manual->position(2.5, 0.0, 4.3);
//manual->textureCoord(1, 1);
manual->position(2.5, 10.0, 4.3); //indice=7
manual->textureCoord(1, 0);
//manual->position(-2.5, 10.0, -4.3);
//manual->textureCoord(0 ,0);
//fifth triangle
manual->position(2.5, 0.0, -4.3); //indice=8
manual->textureCoord(1 ,1);
manual->position(-2.5, 10.0, 4.3); //indice=9
manual->textureCoord(0, 0);
manual->position(-2.5, 0.0, 4.3); //indice=10
manual->textureCoord(0, 1);
//sixth triangle
//manual->position(2.5, 0.0, -4.3);
//manual->textureCoord(1, 1);
//manual->position(-2.5, 10.0 ,4.3);
//manual->textureCoord(0, 0);
manual->position(2.5, 10.0, -4.3); //indice=11
manual->textureCoord(1, 0);
//using indices
manual->index(0);
manual->index(1);
manual->index(2);
manual->index(0);
manual->index(3);
manual->index(1);
manual->index(4);
manual->index(5);
manual->index(6);
manual->index(4);
manual->index(5);
manual->index(7);
manual->index(8);
manual->index(9);
manual->index(10);
manual->index(8);
manual->index(9);
manual->index(11);
manual->end();
// 对于大量的、静止的模型用StaticGeometry可提高渲染效率
// 只适用于用索引列表表示的模型
// 模型加入StaticGeometry后不能再移动
Ogre::StaticGeometry* field = mSceneMgr->createStaticGeometry("fieldOfGrass");
//Convert this object to a Mesh
manual->convertToMesh("BladeOfGrass");
for (int i=0 ;i<50; ++i)
{
for (int j=0; j<50; ++j)
{
Ogre::Entity* ent = mSceneMgr->createEntity("BladeOfGrass");
field->addEntity(ent, Ogre::Vector3(i * 3, -10, j * 3));
}
}
// 计算加入到field中的所有实体的位置
field->build();
}
};
int main()
{
MyApplication app;
app.go();
return 0;
}