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

     

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

  • 相关阅读:
    AOP概述
    函数调用规定
    lexical scoping vs. dynamic scoping
    [C++]C++11新特性
    JavaScript Tutorial 05 #Class#
    JavaScript Tutorial 04 #Function#
    JavaScript Tutorial 03 #Array#
    JavaScript Tutorial 02 #Object#
    JavaScript Tutorial 01 #Basic#
    Win32 Thread Information Block
  • 原文地址:https://www.cnblogs.com/songliquan/p/3333187.html
Copyright © 2020-2023  润新知