基于OpenGL三维模型读取与动态观察.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于OpenGL三维模型读取与动态观察

基于OpenGL三维模型读取与动态观察   【摘 要】在机器人仿真软件开发、三维视景建模等领域,通常需要读取三维建模,这些模型大都由专业的三维建模软件生成,具有特定的文件格式。本文基于OpenGL,对此过程中的模型导入与动态观察部分进行研究。在VS2017环境下,通过OpenGL与Assimp实现三维模型数据文件的可视化,使人们可以获取到模型特定数据,并可直观地看到模型,为其余工作奠定基础。   【关键词】OpenGL;Assimp;模型可视化;动态观察   0 引言   目前,许多优秀的三维建模软件如CATIA、UG、Pro/E等,可以方便地建立各种复杂物体模型,但除了软件所给出的功能外,很难对模型进行控制和操作[1]。OpenGL则更容易实现模型的变换、纹理、交互操作等,但是却没有提供CATIA、UG等建模软件中用于建立复杂三维模型的高级命令,只提供了基本的集合图元(如点、线、多边形)的绘制命令[2]。因此,若能将三维建模软件输出的模型文件,在OpenGL中进行“加工”,可以更好地解?Q实际问题。   1 模型读取与绘制方法   考虑到各平台文件格式不同,为了增强通用性,我们选择通过Assimp库辅助模型读取工作,这样可读入十余种不同格式的主流模型文件,增强了通用性,方便了后续工作。   1.1 Assimp概述   Assimp(Open Asset Import Library)是开源图形库,它会将所有的模型数据加载至Assimp的通用数据结构中[3]。当Assimp加载完模型之后,我们就能够从Assimp的数据结构中提取我们所需的所有数据了。由于Assimp的数据结构保持不变,不论导入的是什么种类的文件格式,它都能够将模型数据从这些不同文件格式中抽象出来,用同一种方式访问所需数据。   当使用Assimp导入一个模型的时候,它通常会将整个模型加载进一个场景对象,它会包含导入的模型中的所有数据。Assimp会将场景载入为一系列的节点,每个节点包含了场景对象中所储存数据的索引,每个节点都可以由任意数量的子节点。   一个网格对象本身包含了渲染所需要的所有相关数据,如顶点、法向量、纹理坐标、面和材质等。一个网格包含了多个面,一个面包含了组成图元的顶点索引。由于顶点数据和顶点索引是分开的,使用一个索引缓冲来渲染是非常方便的。   1.2 场景绘制方式   现在,我们可以根据场景的结构,读取场景对象中的数据并绘制模型。为了更加系统的进行场景绘制,我们构建了Model类与Mesh类,分别对应于模型结构与网格结构:   class Model{   public:   Model(char* path){ };   void Draw(Shader shader);   private:   vectormeshes;   void loadModel( string path);   void processNode(aiNode* node, const aiScene* scene);   Mesh processMesh( aiMesh* mesh, const aiScene* scene);   };   class Mesh{   public:   vectorvertices;   vectorindices;   GLuint VAO;   Mesh(vectorvertices, vectorindices, vector textures);   void Draw(Shader shader);   private:   GLuint VBO, EBO;   void setupMesh();   };   1.2.1 模型读取   首先,读取给定路径的模型文件并加载到Scene对象。除了加载文件之外,我们还可以设定一些选项强制性对导入的数据做一些额外的计算或操作。   1.2.2 处理模型节点   我们首先检查每个节点的网格索引,并索引场景的mMeshes数组来获取对应的网格。返回的网格将会传递到processMesh函数中,它会返回一个Mesh类对象,我们可以将他存储在meshes数组中。当所有网格都被处理后,我们会遍历节点的所有子节点,并对子节点中的网格传递到processMesh函数中,不断递归下去直到节点中不再存在子节点为止。   1.2.3 处理模型网格   网格传递到processMesh函数后,开始对网格进行处理。处理网格的过程主要分为两步:获取所有的定点数据;获取他们的顶点索引。处理后的数据将会存储在两个vector当中,我们会使用他们构建一个Mesh类对象,作为processMesh函数的返回值。   为

文档评论(0)

3471161553 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档