亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于OpenGL的三維模型讀取與動(dòng)態(tài)觀察

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

        張肇同

        【摘 要】在機(jī)器人仿真軟件開(kāi)發(fā)、三維視景建模等領(lǐng)域,通常需要讀取三維建模,這些模型大都由專業(yè)的三維建模軟件生成,具有特定的文件格式。本文基于OpenGL,對(duì)此過(guò)程中的模型導(dǎo)入與動(dòng)態(tài)觀察部分進(jìn)行研究。在VS2017環(huán)境下,通過(guò)OpenGL與Assimp實(shí)現(xiàn)三維模型數(shù)據(jù)文件的可視化,使人們可以獲取到模型特定數(shù)據(jù),并可直觀地看到模型,為其余工作奠定基礎(chǔ)。

        【關(guān)鍵詞】OpenGL;Assimp;模型可視化;動(dòng)態(tài)觀察

        0 引言

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

        1 模型讀取與繪制方法

        考慮到各平臺(tái)文件格式不同,為了增強(qiáng)通用性,我們選擇通過(guò)Assimp庫(kù)輔助模型讀取工作,這樣可讀入十余種不同格式的主流模型文件,增強(qiáng)了通用性,方便了后續(xù)工作。

        1.1 Assimp概述

        Assimp(Open Asset Import Library)是開(kāi)源圖形庫(kù),它會(huì)將所有的模型數(shù)據(jù)加載至Assimp的通用數(shù)據(jù)結(jié)構(gòu)中[3]。當(dāng)Assimp加載完模型之后,我們就能夠從Assimp的數(shù)據(jù)結(jié)構(gòu)中提取我們所需的所有數(shù)據(jù)了。由于Assimp的數(shù)據(jù)結(jié)構(gòu)保持不變,不論導(dǎo)入的是什么種類的文件格式,它都能夠?qū)⒛P蛿?shù)據(jù)從這些不同文件格式中抽象出來(lái),用同一種方式訪問(wèn)所需數(shù)據(jù)。

        當(dāng)使用Assimp導(dǎo)入一個(gè)模型的時(shí)候,它通常會(huì)將整個(gè)模型加載進(jìn)一個(gè)場(chǎng)景對(duì)象,它會(huì)包含導(dǎo)入的模型中的所有數(shù)據(jù)。Assimp會(huì)將場(chǎng)景載入為一系列的節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)包含了場(chǎng)景對(duì)象中所儲(chǔ)存數(shù)據(jù)的索引,每個(gè)節(jié)點(diǎn)都可以由任意數(shù)量的子節(jié)點(diǎn)。

        一個(gè)網(wǎng)格對(duì)象本身包含了渲染所需要的所有相關(guān)數(shù)據(jù),如頂點(diǎn)、法向量、紋理坐標(biāo)、面和材質(zhì)等。一個(gè)網(wǎng)格包含了多個(gè)面,一個(gè)面包含了組成圖元的頂點(diǎn)索引。由于頂點(diǎn)數(shù)據(jù)和頂點(diǎn)索引是分開(kāi)的,使用一個(gè)索引緩沖來(lái)渲染是非常方便的。

        1.2 場(chǎng)景繪制方式

        現(xiàn)在,我們可以根據(jù)場(chǎng)景的結(jié)構(gòu),讀取場(chǎng)景對(duì)象中的數(shù)據(jù)并繪制模型。為了更加系統(tǒng)的進(jìn)行場(chǎng)景繪制,我們構(gòu)建了Model類與Mesh類,分別對(duì)應(yīng)于模型結(jié)構(gòu)與網(wǎng)格結(jié)構(gòu):

        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對(duì)象。除了加載文件之外,我們還可以設(shè)定一些選項(xiàng)強(qiáng)制性對(duì)導(dǎo)入的數(shù)據(jù)做一些額外的計(jì)算或操作。

        1.2.2 處理模型節(jié)點(diǎn)

        我們首先檢查每個(gè)節(jié)點(diǎn)的網(wǎng)格索引,并索引場(chǎng)景的mMeshes數(shù)組來(lái)獲取對(duì)應(yīng)的網(wǎng)格。返回的網(wǎng)格將會(huì)傳遞到processMesh函數(shù)中,它會(huì)返回一個(gè)Mesh類對(duì)象,我們可以將他存儲(chǔ)在meshes數(shù)組中。當(dāng)所有網(wǎng)格都被處理后,我們會(huì)遍歷節(jié)點(diǎn)的所有子節(jié)點(diǎn),并對(duì)子節(jié)點(diǎn)中的網(wǎng)格傳遞到processMesh函數(shù)中,不斷遞歸下去直到節(jié)點(diǎn)中不再存在子節(jié)點(diǎn)為止。

        1.2.3 處理模型網(wǎng)格

        網(wǎng)格傳遞到processMesh函數(shù)后,開(kāi)始對(duì)網(wǎng)格進(jìn)行處理。處理網(wǎng)格的過(guò)程主要分為兩步:獲取所有的定點(diǎn)數(shù)據(jù);獲取他們的頂點(diǎn)索引。處理后的數(shù)據(jù)將會(huì)存儲(chǔ)在兩個(gè)vector當(dāng)中,我們會(huì)使用他們構(gòu)建一個(gè)Mesh類對(duì)象,作為processMesh函數(shù)的返回值。

        為了獲取頂點(diǎn)數(shù)據(jù),我們首先定義一個(gè)Vertex結(jié)構(gòu):

        struct Vertex

        {

        glm::vec3 Position;

        glm::vec3 Normal;

        };

        我們將在每個(gè)迭代之后將它加到vectorvertices數(shù)組中。我們會(huì)遍歷網(wǎng)格中的所有頂點(diǎn)(使用mesh->mNumVertices來(lái)獲?。?,并獲得每個(gè)頂點(diǎn)的位置、法向量等。

        Assimp的接口定義了每個(gè)網(wǎng)格都有一個(gè)面(Face)數(shù)組,一個(gè)面包含了多個(gè)索引,他們定義了在每個(gè)圖元中我們應(yīng)該繪制哪個(gè)頂點(diǎn),并以什么順序繪制。因此,我們遍歷了所有的面(使用mesh->mNumFaces來(lái)獲?。?,并存儲(chǔ)了面的索引到vectorindices中,完成面包含索引的讀取。由此,我們遍歷了所有節(jié)點(diǎn)中的網(wǎng)格,讀取了繪制模型所需要的數(shù)據(jù)。

        1.2.4 繪制網(wǎng)格

        現(xiàn)在,我們有一大列用于渲染的網(wǎng)格數(shù)據(jù)。將這些數(shù)據(jù)按照OpenGL渲染的標(biāo)準(zhǔn)步驟,配置正確的緩沖,并通過(guò)頂點(diǎn)屬性指針定義頂點(diǎn)著色器的布局等,這些設(shè)置都集中在mesh類的成員函數(shù)setupMesh()中。

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

        2 實(shí)驗(yàn)結(jié)果

        根據(jù)前文所述內(nèi)容,在Visual Studio2017平臺(tái)實(shí)現(xiàn)了對(duì)模型文件的讀取、顯示與三維漫游功能。為了驗(yàn)證系統(tǒng)顯示三維模型的實(shí)際效果,選用了CATIA中STL格式的模型文件,下面為得到的三維模型。

        3 結(jié)語(yǔ)

        對(duì)模型文件的讀取與顯示,是對(duì)模型一切后續(xù)操作的前提和基礎(chǔ)。本文通過(guò)對(duì)OpenGL與模型文件的研究,以Visual Studio2017作為開(kāi)發(fā)平臺(tái),利用Assimp庫(kù)讀取模型文件數(shù)據(jù),并通過(guò)OpenGL顯示出了模型,今后,可將這種方法應(yīng)用于機(jī)器人仿真軟件開(kāi)發(fā)、三維視景建模等領(lǐng)域。

        【參考文獻(xiàn)】

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

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

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

        亚洲av无码精品色午夜| 天涯成人国产亚洲精品一区av| 国产精品自线在线播放| 美国又粗又长久久性黄大片| 人妻中文字幕一区二区视频| 在线观看免费日韩精品| 色www视频永久免费| 在线视频99| 国产白浆精品一区二区三区| 女人av天堂国产在线| 欧美日韩精品一区二区视频| 人妻av鲁丝一区二区三区| 亚洲av中文无码乱人伦在线r▽| 久久国产精品老女人| 国产精品午夜福利亚洲综合网| 国产特级毛片aaaaaa高潮流水| 国产福利酱国产一区二区 | 国产人妻久久精品二区三区老狼 | 亚洲人成影院在线无码按摩店| 欧美黑吊大战白妞| 无码av在线a∨天堂毛片| 国产精品国产三级国产在线观| 国产三区二区一区久久 | 亚洲娇小与黑人巨大交| 亚洲精品无码久久久久av麻豆 | 精品少妇一区二区av免费观看| 国产无套内射久久久国产| 五十路熟女一区二区三区| 无码国产一区二区色欲| 日本成人中文字幕亚洲一区| 偷拍综合在线视频二区日韩| 高潮毛片无遮挡高清视频播放| 男男啪啪激烈高潮cc漫画免费| 日韩秘 无码一区二区三区| 久久精品国产亚洲av网在| 免费在线黄色电影| 亚洲国产精品久久久久秋霞1| 成人自拍视频国产一区| 日本一区二区三级免费| 国产精品扒开腿做爽爽爽视频| 黄色毛片在线看|