999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于OpenGL的三維模型讀取與動態觀察

2018-02-05 18:57:08張肇同
科技視界 2017年34期

張肇同

【摘 要】在機器人仿真軟件開發、三維視景建模等領域,通常需要讀取三維建模,這些模型大都由專業的三維建模軟件生成,具有特定的文件格式。本文基于OpenGL,對此過程中的模型導入與動態觀察部分進行研究。在VS2017環境下,通過OpenGL與Assimp實現三維模型數據文件的可視化,使人們可以獲取到模型特定數據,并可直觀地看到模型,為其余工作奠定基礎。

【關鍵詞】OpenGL;Assimp;模型可視化;動態觀察

0 引言

目前,許多優秀的三維建模軟件如CATIA、UG、Pro/E等,可以方便地建立各種復雜物體模型,但除了軟件所給出的功能外,很難對模型進行控制和操作[1]。OpenGL則更容易實現模型的變換、紋理、交互操作等,但是卻沒有提供CATIA、UG等建模軟件中用于建立復雜三維模型的高級命令,只提供了基本的集合圖元(如點、線、多邊形)的繪制命令[2]。因此,若能將三維建模軟件輸出的模型文件,在OpenGL中進行“加工”,可以更好地解決實際問題。

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函數的返回值。

為了獲取頂點數據,我們首先定義一個Vertex結構:

struct Vertex

{

glm::vec3 Position;

glm::vec3 Normal;

};

我們將在每個迭代之后將它加到vectorvertices數組中。我們會遍歷網格中的所有頂點(使用mesh->mNumVertices來獲取),并獲得每個頂點的位置、法向量等。

Assimp的接口定義了每個網格都有一個面(Face)數組,一個面包含了多個索引,他們定義了在每個圖元中我們應該繪制哪個頂點,并以什么順序繪制。因此,我們遍歷了所有的面(使用mesh->mNumFaces來獲?。⒋鎯α嗣娴乃饕絭ectorindices中,完成面包含索引的讀取。由此,我們遍歷了所有節點中的網格,讀取了繪制模型所需要的數據。

1.2.4 繪制網格

現在,我們有一大列用于渲染的網格數據。將這些數據按照OpenGL渲染的標準步驟,配置正確的緩沖,并通過頂點屬性指針定義頂點著色器的布局等,這些設置都集中在mesh類的成員函數setupMesh()中。

初始化Model類對象,并調用其成員函數Draw(Shader shader),此函數將遍歷類對象的meshes數組,并調用Mesh類的成員函數Draw(Shader shader),根據頂點數組對象所綁定緩沖中的數據,繪制模型。

2 實驗結果

根據前文所述內容,在Visual Studio2017平臺實現了對模型文件的讀取、顯示與三維漫游功能。為了驗證系統顯示三維模型的實際效果,選用了CATIA中STL格式的模型文件,下面為得到的三維模型。

3 結語

對模型文件的讀取與顯示,是對模型一切后續操作的前提和基礎。本文通過對OpenGL與模型文件的研究,以Visual Studio2017作為開發平臺,利用Assimp庫讀取模型文件數據,并通過OpenGL顯示出了模型,今后,可將這種方法應用于機器人仿真軟件開發、三維視景建模等領域。

【參考文獻】

[1]張代聰.基于OpenGL的交互式PLC虛擬仿真系統[D].山東大學,2012.

[2]Richard S.Wright, Jr.OpenGL超級寶典[M].北京:人民郵電出版社,2012.

[3]肖健,魏雄,王仁波.基于 OpenGL 的大型建筑三維場景模擬的實現與意義[J].電子質量,2016(11):88-92.

主站蜘蛛池模板: 日本在线国产| 波多野结衣一区二区三区88| 黄色网址手机国内免费在线观看| 久久精品嫩草研究院| 亚洲国产精品无码久久一线| 亚洲国产日韩一区| 69av在线| 欧美伦理一区| 又污又黄又无遮挡网站| 国产SUV精品一区二区6| 色综合激情网| 欧美无遮挡国产欧美另类| 亚洲色图综合在线| 日韩人妻少妇一区二区| 久久青草热| 国产日韩欧美黄色片免费观看| 亚洲天堂网在线观看视频| 国产女人在线| 久久久久无码精品| 美女一区二区在线观看| 国语少妇高潮| 无码中文字幕乱码免费2| 成人午夜天| 亚洲精品午夜天堂网页| 97久久精品人人做人人爽| 2020国产精品视频| 久久一色本道亚洲| 欧美A级V片在线观看| 国产白浆一区二区三区视频在线 | 香蕉久久国产超碰青草| 国产精选自拍| 免费无码网站| 中国国产A一级毛片| 国产成人综合日韩精品无码首页 | 无码av免费不卡在线观看| 91无码国产视频| 亚洲精品人成网线在线 | 精品久久久久久成人AV| 香蕉蕉亚亚洲aav综合| 都市激情亚洲综合久久| 欧美精品亚洲精品日韩专区va| 国产亚洲精品91| 亚洲精品福利视频| 免费人成在线观看成人片| 午夜国产精品视频| 天天躁夜夜躁狠狠躁躁88| 国产精品视频3p| 国产成人乱码一区二区三区在线| 亚洲视频色图| 国产在线观看一区精品| 日韩第九页| 无码'专区第一页| av性天堂网| 天天操天天噜| 国产18在线播放| 国产XXXX做受性欧美88| 国产精品无码在线看| a亚洲视频| 免费可以看的无遮挡av无码| 亚洲AV无码久久精品色欲 | 欧美在线国产| 真实国产乱子伦高清| 国产精品偷伦在线观看| 精品国产免费第一区二区三区日韩| 亚洲国产成人自拍| 97久久精品人人| 国产亚洲精品yxsp| 国产成人综合日韩精品无码首页 | 怡红院美国分院一区二区| 婷婷色在线视频| 免费观看国产小粉嫩喷水| 国产精品极品美女自在线网站| 欧美一级高清片久久99| 99福利视频导航| 亚洲乱伦视频| 色婷婷色丁香| 99福利视频导航| 国产福利影院在线观看| 国产久操视频| 国产午夜福利亚洲第一| 国产福利影院在线观看| 中文字幕久久亚洲一区|