• Ogre渲染简单的几何物体的方法


    转载请注明出处!http://www.cnblogs.com/pulas/

    在Ogre里有两种方法来创建自定义网格。第一种是继承SimpleRenderable,并直接提供给它顶点和索引缓存。这是最直接的创建方式,但也是最不直观的。为了使事情更简单,Ogre提供了一个更棒的接口叫做ManualObject,它能让你用一些简单的函数来定义一个网格,而不用往缓存里写原始数据。仅仅调用"position"和"colour"等函数即可,而不用往缓存里丢位置、颜色等数据。

    使用ManualObject或者其派生类渲染简单的几何物体的步骤如下:

    1. 新建一个ManualObject对象

    mManualObj = mSceneManager->createManualObject ("SimpleStuff");

    2. 设置该ManualObject的参数(可以不设置以使用默认参数)

    - 设置其渲染队列所在的组

    mManualObj->setRenderQueueGroup(RENDER_QUEUE_OVERLAY);

    - 使用单元投影矩阵和单元视图矩阵, 这两个默认为false, 即使用相机的视图矩阵和投影矩阵

    mManualObj->setUseIdentityProjection(true);

    mManualObj->setUseIdentityView(true);

    使用这两个函数之后, 所绘制的物体坐标范围位于(-1, -1, -1)至(1, 1, 1)之间

    - 设置查询参数

    mManualObj->setQueryFlags(0);

    3. 调用绘制函数

    mManualObj->clear();

    mManualObj->begin("", RenderOperation::OT_LINE_STRIP);

    for (int i = 0; i < 5; i++)

    {

            mManualObj->position(pos[i]);

    }

    mManualObj->end();

    4. 创建场景节点挂接该对象

    mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(mManualObj);

    注意:

    - 若在绘制前能确定顶点或索引的个数,则应先调用estimateVertexCount(size_t vcount)和estimateIndexCount(size_t icount)方法。虽然这不是必需的,但是这可以避免在定义顶点时重新分配内存以提高效率。

    - 对于每个顶点,可以调用position(), normal(), textureCoord(), colour()等方法定义顶点数据,注意,每次调用position()即开始了一个新的顶点,第一个顶点的数据结构决定了所有顶点的数据结构,不能再在后续顶点定义中添加新类型分量。

    - 通过调用index(uint32 idx)使用索引,或者调用triangle(uint32 i1, uint32 i2, uint32 i3)对三角形使用索引,或者调用quad (uint32 i1, uint32 i2, uint32 i3, uint32 i4) 对四边形使用索引。顶点的顺序:逆时针为正面。

    - 如果想使用不同的渲染操作类型或材质构造更多的几何体,可使用多个begin-end块。这个类在内部通过一个Renderable列表来组织维护数据,一个begin-end块对应一个Renderable。

    - 可以使用beginUpdate()方法动态改变几何体,要想这样做,必须在第一次调用begin()前调用setDynamic(true)方法,并且考虑使用estimateVertexCount(size_t vcount)和estimateIndexCount(size_t icount )方法,使之在顶点数增长时以增量式分配内存,而不是再重新构造一个新的内存块。

    Ogre场景的组成

    总体上来看,场景中的Objects可分为可动实体和不可动实体。其中,Entities、Cameras和Lights属于Movable Objects,World Geometry属于Immovable Objects。Materials依附于别的Objects之上,无所谓动与不动。

    OGRE把离散的,相对较小的,可移动的物体定义为Ogre::MovableObject。其派生出来的类如下图所示。

    clip_image002

    Camera属于Frustum的子类:

    clip_image004

    从另一个角度看,物体有可渲染和不可渲染之分。OGRE中能被渲染的Objects都继承于Ogre::Renderable类:

    clip_image006

    比较MovableObject和Renderable可以发现, Entity属于MovableObject但却不属于Renderable:

    clip_image008

    Renderable有一个SubEntity的子类,而Entity是由SubEntity组成的:

    typedef std::vector<SubEntity*> SubEntityList;

    SubEntityList mSubEntityList;

    由此可以断定,Entity是被分解为SubEntity完成渲染的。

    clip_image010

  • 相关阅读:
    nested exception is java.lang.NoClassDefFoundError: org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter
    Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
    技术笔记:多线程(Runnable)类或者是监听器中使用Autowired自动注入出现null的问题
    java获取本机IP
    [Java基础]StringUtils.join()方法与String.join()方法的使用
    SpringBoot bootstrap.yml bootstrap.properties 配置未生效
    ((TextBox)(GridView1.Rows[GridView1.EditIndex].Cells[1].Controls[0])).Text; 转换出错、获取不到值的解析 Asp.net
    C# 调用 origin 批量作图
    c# 调用R语言 实现线性拟合 方差 Ftest概率检验求p-value
    c#对象深复制 序列化与反序列化
  • 原文地址:https://www.cnblogs.com/pulas/p/2368230.html
Copyright © 2020-2023  润新知