这一节练习一下手动创建实体,用到了对象(ManualObject)
第一,依然是模板
#include "ExampleApplication.h" class Example1 : public ExampleApplication { public: void createScene() { } protected: private: }; #include <windows.h> INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) { Example1 app; app.go(); return 0; }
第二,我们在createScene()添加自己手动创建的实体
首先,创建一个平面,加载材质,详细如注释
1 Ogre::Plane plane(Ogre::Vector3::UNIT_Y,-10);//创建一个在原点下方10单位,并且以y轴为法线的平面 2 Ogre::MeshManager::getSingleton().createPlane("plane",//平面名称 3 Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,//这个平面属于哪个资源组 4 plane,//平面的名称,上面创建的 5 1500,1500,//平面大小 6 200,200,//分段数,平面组成的精细度, 7 true,//为true时,它指的是向量是以垂直于平面创建 8 1,//2D纹理坐标集的数量 9 5,5,//纹理在u方向和v方向应该重复的次数 10 Vector3::UNIT_Z);//当前平面的向上方向 11 12 Ogre::Entity *ent = mSceneMgr->createEntity("GrassPlane","plane"); 13 mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent); 14 ent->setMaterialName("Examples/GrassFloor");
然后,手动创建对象,我计划在面板上显示一个数字9,其中begin()是手动创建对象的开始
1 Ogre::ManualObject *manualObj = mSceneMgr->createManualObject("grass"); 2 manualObj->begin("Examples/GrassBlades",RenderOperation::OT_TRIANGLE_LIST);//开始创建
其中的RenderOperation::OT_TRIANGLE_LIST有必要解释一下,这是一个枚举常量,源代码如下:
1 enum OperationType { 2 /// A list of points, 1 vertex per point 3 OT_POINT_LIST = 1,//点列表 4 /// A list of lines, 2 vertices per line 5 OT_LINE_LIST = 2,//线列表 6 /// A strip of connected lines, 1 vertex per line plus 1 start vertex 7 OT_LINE_STRIP = 3,//一系列连接着的线 8 /// A list of triangles, 3 vertices per triangle 9 OT_TRIANGLE_LIST = 4,//一系列的三角形列表 10 /// A strip of triangles, 3 vertices for the first triangle, and 1 per triangle after that 11 OT_TRIANGLE_STRIP = 5,//一系列连着的三角形 12 /// A fan of triangles, 3 vertices for the first triangle, and 1 per triangle after that 13 OT_TRIANGLE_FAN = 6//连接成扇形的三角形序列 14 };
先来看一段代码:
1 //创建一个三角形 2 manualObj->position(0,10,0); 3 manualObj->textureCoord(0,0); 4 manualObj->position(0,0,0); 5 manualObj->textureCoord(0,1);//纹理坐标,二元组,uv 6 manualObj->position(10,0,0);//定点坐标,三元组,xyz 7 manualObj->textureCoord(1,1);//Add a texture coordinate to the current vertex. 8 //创建另一个三角形 9 manualObj->position(0,10,0); 10 manualObj->textureCoord(0,0); 11 manualObj->position(10,10,0); 12 manualObj->textureCoord(1,0);//纹理坐标,二元组,uv 13 manualObj->position(10,0,0);//定点坐标,三元组,xyz 14 manualObj->textureCoord(1,1);//Add a texture coordinate to the current vertex.
这段代码实现的效果是
代码解释:
我们使用的是OT_TRIANGLE_LIST,这是一系列的三角形,每个三角形有三个顶点组成,position()(三元组)给出位置创建两个个三角形组成一个长方形,textureCoord()给出一会要放的纹理的坐标(uv坐标),其中纹理坐标的组成方式为每一个平面坐标如图所示
每一个三角形包括三个点,分别对应三个纹理坐标(如图2)。
最后我们结束绘制,使用end()函数,创建一个场景节点把刚创建的对象绑定到场景节点上。
1 manualObj->end();//创建结束 2 Ogre::SceneNode*grassNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("GrassNode",Ogre::Vector3(0,-10,0)); 3 grassNode->attachObject(manualObj);
现在看下总的代码:
1 void createScene() 2 { 3 Ogre::Plane plane(Ogre::Vector3::UNIT_Y,-10);//创建一个在原点下方10单位,并且以y轴为法线的平面 4 Ogre::MeshManager::getSingleton().createPlane("plane",//平面名称 5 Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,//这个平面属于哪个资源组 6 plane,//平面的名称,上面创建的 7 1500,1500,//平面大小 8 200,200,//分段数,平面组成的精细度, 9 true,//为true时,它指的是向量是以垂直于平面创建 10 1,//2D纹理坐标集的数量 11 5,5,//纹理在u方向和v方向应该重复的次数 12 Vector3::UNIT_Z);//当前平面的向上方向 13 14 Ogre::Entity *ent = mSceneMgr->createEntity("GrassPlane","plane"); 15 mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent); 16 ent->setMaterialName("Examples/GrassFloor"); 17 18 //手动创建我们的新ManualObject 19 Ogre::ManualObject *manualObj = mSceneMgr->createManualObject("grass"); 20 manualObj->begin("Examples/GrassBlades",RenderOperation::OT_TRIANGLE_LIST);//开始创建 21 22 //创建一个三角形 23 manualObj->position(0,10,0); 24 manualObj->textureCoord(0,0); 25 manualObj->position(0,0,0); 26 manualObj->textureCoord(0,1);//纹理坐标,二元组,uv 27 manualObj->position(10,0,0);//定点坐标,三元组,xyz 28 manualObj->textureCoord(1,1);//Add a texture coordinate to the current vertex. 29 30 manualObj->position(0,10,0); 31 manualObj->textureCoord(0,0); 32 manualObj->position(10,10,0); 33 manualObj->textureCoord(1,0);//纹理坐标,二元组,uv 34 manualObj->position(10,0,0);//定点坐标,三元组,xyz 35 manualObj->textureCoord(1,1);//Add a texture coordinate to the current vertex. 36 //第二面 37 manualObj->position(10,10,-10);//定点坐标,三元组,xyz 38 manualObj->textureCoord(0,0);//Add a texture coordinate to the current vertex. 39 manualObj->position(10,0,-10); 40 manualObj->textureCoord(0,1);//纹理坐标,二元组,uv 41 manualObj->position(10,0,0); 42 manualObj->textureCoord(1,1); 43 44 manualObj->position(10,10,-10);//定点坐标,三元组,xyz 45 manualObj->textureCoord(0,0);//Add a texture coordinate to the current vertex. 46 manualObj->position(10,10,0); 47 manualObj->textureCoord(1,0);//纹理坐标,二元组,uv 48 manualObj->position(10,0,0); 49 manualObj->textureCoord(1,1); 50 51 //第三个面 52 manualObj->position(0,10,-10);//定点坐标,三元组,xyz 53 manualObj->textureCoord(0,0);//Add a texture coordinate to the current vertex. 54 manualObj->position(0,0,-10); 55 manualObj->textureCoord(0,1);//纹理坐标,二元组,uv 56 manualObj->position(10,0,-10); 57 manualObj->textureCoord(1,1); 58 59 manualObj->position(0,10,-10);//定点坐标,三元组,xyz 60 manualObj->textureCoord(0,0);//Add a texture coordinate to the current vertex. 61 manualObj->position(10,0,-10); 62 manualObj->textureCoord(1,1);//纹理坐标,二元组,uv 63 manualObj->position(10,10,-10); 64 manualObj->textureCoord(1,0); 65 //第四个面 66 manualObj->position(0,10,-10);//定点坐标,三元组,xyz 67 manualObj->textureCoord(0,0);//Add a texture coordinate to the current vertex. 68 manualObj->position(0,0,0); 69 manualObj->textureCoord(1,1); 70 manualObj->position(0,0,-10); 71 manualObj->textureCoord(0,1);//纹理坐标,二元组,uv 72 73 manualObj->position(0,10,-10);//定点坐标,三元组,xyz 74 manualObj->textureCoord(0,0);//Add a texture coordinate to the current vertex. 75 manualObj->position(0,10,0); 76 manualObj->textureCoord(1,0); 77 manualObj->position(0,0,0); 78 manualObj->textureCoord(1,1);//纹理坐标,二元组,uv 79 80 //*****************************************************************************************/// 81 //第五面 82 manualObj->position(10,10,10);//定点坐标,三元组,xyz 83 manualObj->textureCoord(0,0);//Add a texture coordinate to the current vertex. 84 manualObj->position(10,0,10); 85 manualObj->textureCoord(0,1);//纹理坐标,二元组,uv 86 manualObj->position(10,0,0); 87 manualObj->textureCoord(1,1); 88 89 manualObj->position(10,10,10);//定点坐标,三元组,xyz 90 manualObj->textureCoord(0,0);//Add a texture coordinate to the current vertex. 91 manualObj->position(10,10,0); 92 manualObj->textureCoord(1,0);//纹理坐标,二元组,uv 93 manualObj->position(10,0,0); 94 manualObj->textureCoord(1,1); 95 96 //第六个面 97 manualObj->position(0,10,10);//定点坐标,三元组,xyz 98 manualObj->textureCoord(0,0);//Add a texture coordinate to the current vertex. 99 manualObj->position(0,0,10); 100 manualObj->textureCoord(0,1);//纹理坐标,二元组,uv 101 manualObj->position(10,0,10); 102 manualObj->textureCoord(1,1); 103 104 manualObj->position(0,10,10);//定点坐标,三元组,xyz 105 manualObj->textureCoord(0,0);//Add a texture coordinate to the current vertex. 106 manualObj->position(10,0,10); 107 manualObj->textureCoord(1,1);//纹理坐标,二元组,uv 108 manualObj->position(10,10,10); 109 manualObj->textureCoord(1,0); 110 111 manualObj->end();//创建结束 112 Ogre::SceneNode*grassNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("GrassNode",Ogre::Vector3(0,-10,0)); 113 grassNode->attachObject(manualObj); 114 115 }
在以上代码中,一共绘制了六个面,刚好组成数字9,如图
现在总结一下手动绘制对象的步骤:
1、需要先用场景管理器去创建一个人造物体的指针
Ogre::ManualObject *manualObj = mSceneMgr->createManualObject("grass");
2、然后使用人造物体的begin/end对进行绘制
manualObj->begin("Examples/GrassBlades",RenderOperation::OT_TRIANGLE_LIST);//开始创建
.......................
manualObj->end();//创建结束
3、将对象绑定到节点上
Ogre::SceneNode*grassNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("GrassNode",Ogre::Vector3(0,-10,0));
grassNode->attachObject(manualObj);
哈哈,发挥你的想象力,绘制你自己的物体吧。