Ogre 2011-11-30

自己创建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;
}

  

  

 

转载于:https://www.cnblogs.com/kex1n/archive/2011/11/30/2269159.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值