ogre3D学习基础16 -- 手动创建实体(ManualObject)

这一节练习一下手动创建实体,用到了对象(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);

 

  哈哈,发挥你的想象力,绘制你自己的物体吧。

原文地址:https://www.cnblogs.com/songliquan/p/3333187.html