Ogre:ManualObject

本文详细介绍了在Ogre引擎中如何通过手动物体(ManualObject)创建简单几何体,包括创建过程、绘制规则及应用实例。

通常在Ogre中我们是导入点mesh文件来进行构造实体的,但是很多情况下我们可能就需要创建一个非常简单的平面或是线,或是有时想自己在程序中创建这样物体,这就需要用到Ogre的manual object,它就像你用opengl在程序中绘制一个物体的道理一样,在程序中定义你绘制的信息,而是用起来也很像在opengl中绘制物体。

创建一个人造物体的方法通常是这样的:

1.需要先用场景管理器去创建一个人造物体的指针

ManualObject* mo=smgr->createManualObject("mo");

2.然后使用人造物体的begin/end对进行绘制,和在opengl中很类似,但是规则有些不同:

mo->begin("BaseWhiteNoLighting",RenderOperation::OT_TRIANGLE_LIST);首先制定你需要绘制什么元素,用什么材质

然后下面就制定点的信息,

每次用mo->position指定一个点的位置,然后在这句后面和下一个mo->position前面指定这个顶点的颜色、法向等,这个和opengl是完全不同的

mo->position(-100,100,0)

mo->colour(0,0,1); 
mo->position(100,100,0);

是说第一个顶点的颜色是蓝色,而不是第二个!

如果不指定颜色信息,那么该店的颜色为上一个指定了颜色的顶点的颜色。

你可以再一个manulobject中书写多个begin end对

         当我们创建好manualobject后,为了在场景中渲染他,只需要将它用scenenode::attach到一个场景节点上

        或者有时你需要将这个manualobject转化为一个mesh,需要调用manualobject的convertToMesh函数

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/leonwei/archive/2010/08/09/5799748.aspx

<think> 我们正在处理一个C++头文件,用于定义MeshVisual类,该类用于在RViz中可视化网格(mesh)。 主要功能包括:创建网格对象、设置消息数据、设置位置和方向、设置颜色。 我们需要注意类的成员和方法的用途。 </think> ```cpp /** * @file mesh_visual.h * @brief 网格可视化实现类 * * 功能:将几何多面体网格数据转换为Ogre3D可渲染的网格对象 * 特点:使用rviz::MeshShape实现高效三角网格渲染 */ #ifndef MESH_VISUAL_H #define MESH_VISUAL_H // 几何处理工具 #include <decomp_geometry/polyhedron.h> ///< 多面体几何结构定义 #include <Eigen/Eigenvalues> ///< 特征值计算(用于法线/姿态估计) // Ogre3D渲染引擎组件 #include <OGRE/OgreVector3.h> #include <OGRE/OgreSceneNode.h> #include <OGRE/OgreSceneManager.h> // RViz网格渲染组件 #include <rviz/ogre_helpers/mesh_shape.h> ///< 三角网格可视化专用类 namespace decomp_rviz_plugins { /** * @brief 网格可视化实现类 * * 核心能力: * 1. 将多面体边界描述(vec_E<vec_Vec3f>)转化为三角剖分的网格 * 2. 支持整体坐标变换(位置+姿态) * 3. 统一颜色/透明度设置 * * 设计特点:单MeshShape管理(对比EllipsoidArray的多对象模式) */ class MeshVisual { public: /** * @brief 构造函数 * @param scene_manager Ogre场景管理器(负责图形资源) * @param parent_node 父场景节点(用于坐标系变换) */ MeshVisual(Ogre::SceneManager *scene_manager, Ogre::SceneNode *parent_node); /// 析构函数(自动销毁网格对象) virtual ~MeshVisual(); /** * @brief 更新网格数据 * @param bds 多面体边界描述(外层vector为多面体数量,内层vector为顶点集) * * 处理流程: * 1. 清除现有网格 * 2. 执行三角剖分(通常在decomp_geometry中实现) * 3. 创建新的MeshShape并填充顶点数据 */ void setMessage(const vec_E<vec_Vec3f> &bds); /// 设置网格整体位移(Ogre世界坐标系) void setFramePosition(const Ogre::Vector3 &position); /// 设置网格整体旋转(四元数姿态) void setFrameOrientation(const Ogre::Quaternion &orientation); /// 设置网格颜色和透明度(RGBA参数,0-1范围) void setColor(float r, float g, float b, float a); private: std::unique_ptr<rviz::MeshShape> obj_; ///< 网格对象(智能指针自动管理) Ogre::SceneNode *frame_node_; ///< 参考坐标系节点(位姿变换载体) Ogre::SceneManager *scene_manager_; ///< Ogre场景管理器(资源生命周期控制) }; } // 命名空间结束 #endif // 头文件保护宏结束 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值