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

时间:2023-03-10 01:55:13
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 ;
}

  第二,我们在createScene()添加自己手动创建的实体

  首先,创建一个平面,加载材质,详细如注释

     Ogre::Plane plane(Ogre::Vector3::UNIT_Y,-);//创建一个在原点下方10单位,并且以y轴为法线的平面
Ogre::MeshManager::getSingleton().createPlane("plane",//平面名称
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,//这个平面属于哪个资源组
plane,//平面的名称,上面创建的
,,//平面大小
,,//分段数,平面组成的精细度,
true,//为true时,它指的是向量是以垂直于平面创建
,//2D纹理坐标集的数量
,,//纹理在u方向和v方向应该重复的次数
Vector3::UNIT_Z);//当前平面的向上方向 Ogre::Entity *ent = mSceneMgr->createEntity("GrassPlane","plane");
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);
ent->setMaterialName("Examples/GrassFloor");

  然后,手动创建对象,我计划在面板上显示一个数字9,其中begin()是手动创建对象的开始

     Ogre::ManualObject *manualObj = mSceneMgr->createManualObject("grass");
manualObj->begin("Examples/GrassBlades",RenderOperation::OT_TRIANGLE_LIST);//开始创建

  其中的RenderOperation::OT_TRIANGLE_LIST有必要解释一下,这是一个枚举常量,源代码如下:

 enum OperationType {
/// A list of points, 1 vertex per point
OT_POINT_LIST = ,//点列表
/// A list of lines, 2 vertices per line
OT_LINE_LIST = ,//线列表
/// A strip of connected lines, 1 vertex per line plus 1 start vertex
OT_LINE_STRIP = ,//一系列连接着的线
/// A list of triangles, 3 vertices per triangle
OT_TRIANGLE_LIST = ,//一系列的三角形列表
/// A strip of triangles, 3 vertices for the first triangle, and 1 per triangle after that
OT_TRIANGLE_STRIP = ,//一系列连着的三角形
/// A fan of triangles, 3 vertices for the first triangle, and 1 per triangle after that
OT_TRIANGLE_FAN = //连接成扇形的三角形序列
};

    先来看一段代码:

        //创建一个三角形
manualObj->position(,,);
manualObj->textureCoord(,);
manualObj->position(,,);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
    //创建另一个三角形
manualObj->position(,,);
manualObj->textureCoord(,);
manualObj->position(,,);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.

  这段代码实现的效果是

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

  代码解释:

  我们使用的是OT_TRIANGLE_LIST,这是一系列的三角形,每个三角形有三个顶点组成,position()(三元组)给出位置创建两个个三角形组成一个长方形,textureCoord()给出一会要放的纹理的坐标(uv坐标),其中纹理坐标的组成方式为每一个平面坐标如图所示

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

  每一个三角形包括三个点,分别对应三个纹理坐标(如图2)。

  最后我们结束绘制,使用end()函数,创建一个场景节点把刚创建的对象绑定到场景节点上。

1      manualObj->end();//创建结束
Ogre::SceneNode*grassNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("GrassNode",Ogre::Vector3(,-,));
grassNode->attachObject(manualObj);

  现在看下总的代码: 

 void createScene()
{
Ogre::Plane plane(Ogre::Vector3::UNIT_Y,-);//创建一个在原点下方10单位,并且以y轴为法线的平面
Ogre::MeshManager::getSingleton().createPlane("plane",//平面名称
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,//这个平面属于哪个资源组
plane,//平面的名称,上面创建的
,,//平面大小
,,//分段数,平面组成的精细度,
true,//为true时,它指的是向量是以垂直于平面创建
,//2D纹理坐标集的数量
,,//纹理在u方向和v方向应该重复的次数
Vector3::UNIT_Z);//当前平面的向上方向 Ogre::Entity *ent = mSceneMgr->createEntity("GrassPlane","plane");
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);
ent->setMaterialName("Examples/GrassFloor"); //手动创建我们的新ManualObject
Ogre::ManualObject *manualObj = mSceneMgr->createManualObject("grass");
manualObj->begin("Examples/GrassBlades",RenderOperation::OT_TRIANGLE_LIST);//开始创建 //创建一个三角形
manualObj->position(,,);
manualObj->textureCoord(,);
manualObj->position(,,);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex. manualObj->position(,,);
manualObj->textureCoord(,);
manualObj->position(,,);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
//第二面
manualObj->position(,,-);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
manualObj->position(,,-);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,);
manualObj->textureCoord(,); manualObj->position(,,-);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
manualObj->position(,,);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,);
manualObj->textureCoord(,); //第三个面
manualObj->position(,,-);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
manualObj->position(,,-);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,-);
manualObj->textureCoord(,); manualObj->position(,,-);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
manualObj->position(,,-);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,-);
manualObj->textureCoord(,);
//第四个面
manualObj->position(,,-);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
manualObj->position(,,);
manualObj->textureCoord(,);
manualObj->position(,,-);
manualObj->textureCoord(,);//纹理坐标,二元组,uv manualObj->position(,,-);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
manualObj->position(,,);
manualObj->textureCoord(,);
manualObj->position(,,);
manualObj->textureCoord(,);//纹理坐标,二元组,uv //*****************************************************************************************///
//第五面
manualObj->position(,,);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
manualObj->position(,,);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,);
manualObj->textureCoord(,); manualObj->position(,,);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
manualObj->position(,,);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,);
manualObj->textureCoord(,); //第六个面
manualObj->position(,,);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
manualObj->position(,,);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,);
manualObj->textureCoord(,); manualObj->position(,,);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
manualObj->position(,,);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,);
manualObj->textureCoord(,); manualObj->end();//创建结束
Ogre::SceneNode*grassNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("GrassNode",Ogre::Vector3(,-,));
grassNode->attachObject(manualObj); }

关键代码

  在以上代码中,一共绘制了六个面,刚好组成数字9,如图

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

 

 现在总结一下手动绘制对象的步骤:

  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);

 

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