Android OpenGLES2.0(四)——正方形和圓形

上篇博客中我們已經(jīng)使用到了相機(jī)和投影域滥,利用變換矩陣昆汹,繪制出了等腰直角三角形。在本篇博客中树瞭,我們繪制正方形和圓形同樣少不了變換矩陣拇厢。

構(gòu)建正方形和圓形

前面提到過(guò)筏勒,在OpenGLES的世界里面是沒有正方形和圓形的,只有點(diǎn)旺嬉、線、三角形厨埋。三角形就是OpenGLES提供的最復(fù)雜的圖元單位邪媳。所以我們要繪制填充的正方形和圓形就需要利用三角形來(lái)實(shí)現(xiàn)。

正方形

正方形的構(gòu)建比較簡(jiǎn)單荡陷,可以用兩個(gè)三角形組成雨效。當(dāng)然,你也可以用很多很多三角形去合成一個(gè)正方形废赞,只要你樂意徽龟。如下圖所示,我們可以按照123組成的三角形和134組成的三角形唉地,兩個(gè)拼合成一個(gè)正方形据悔。


可以設(shè)置正方形的坐標(biāo)數(shù)組為:

static float triangleCoords[] = {
            -0.5f,  0.5f, 0.0f, // top left
            -0.5f, -0.5f, 0.0f, // bottom left
            0.5f, -0.5f, 0.0f, // bottom right
            0.5f,  0.5f, 0.0f  // top right
    };

圓形

圓形的構(gòu)建,相對(duì)復(fù)雜一點(diǎn)耘沼,我們可以把圓形看成一個(gè)正多邊形极颓,邊越多,圓越平滑群嗤。如下圖所示菠隆,分別為正六邊形、正八邊形狂秘、正十六邊形和正一百邊形骇径。


以六邊形為例,由012者春、023破衔,034、045钱烟、056运敢、061六個(gè)三角形,更多變形同樣如此忠售。
利用簡(jiǎn)單的數(shù)學(xué)知識(shí)传惠,即可得到,以多邊形中心建立直角坐標(biāo)系稻扬,得到n變形的頂點(diǎn)坐標(biāo)為:

private float[]  createPositions(){
    ArrayList<Float> data=new ArrayList<>();
    data.add(0.0f);             //設(shè)置圓心坐標(biāo)
    data.add(0.0f);             
    data.add(0.0f);
    float angDegSpan=360f/n;
    for(float i=0;i<360+angDegSpan;i+=angDegSpan){
        data.add((float) (radius*Math.sin(i*Math.PI/180f))); 
        data.add((float)(radius*Math.cos(i*Math.PI/180f)));
        data.add(0.0f);
    }
    float[] f=new float[data.size()];
    for (int i=0;i<f.length;i++){
        f[i]=data.get(i);
    }
    return f;
}

圖形的繪制

得到了坐標(biāo)數(shù)組卦方,剩下的工作就和三角形的繪制基本相同了。唯一不同的地方泰佳,是需要修改:

GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 1);

為:

GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, shapePos.length/3);

GLES20.glDrawArrays的第一個(gè)參數(shù)表示繪制方式盼砍,第二個(gè)參數(shù)表示偏移量尘吗,第三個(gè)參數(shù)表示頂點(diǎn)個(gè)數(shù)。
繪制方式有:

int GL_POINTS //將傳入的頂點(diǎn)坐標(biāo)作為單獨(dú)的點(diǎn)繪制
int GL_LINES //將傳入的坐標(biāo)作為單獨(dú)線條繪制浇坐,ABCDEFG六個(gè)頂點(diǎn)睬捶,繪制AB、CD近刘、EF三條線
int GL_LINE_STRIP //將傳入的頂點(diǎn)作為折線繪制擒贸,ABCD四個(gè)頂點(diǎn),繪制AB觉渴、BC介劫、CD三條線
int GL_LINE_LOOP //將傳入的頂點(diǎn)作為閉合折線繪制,ABCD四個(gè)頂點(diǎn)案淋,繪制AB座韵、BC、CD踢京、DA四條線誉碴。
int GL_TRIANGLES //將傳入的頂點(diǎn)作為單獨(dú)的三角形繪制,ABCDEF繪制ABC,DEF兩個(gè)三角形
int GL_TRIANGLE_FAN //將傳入的頂點(diǎn)作為扇面繪制瓣距,ABCDEF繪制ABC翔烁、ACD、ADE旨涝、AEF四個(gè)三角形
int GL_TRIANGLE_STRIP //將傳入的頂點(diǎn)作為三角條帶繪制蹬屹,ABCDEF繪制ABC,BCD,CDE,DEF四個(gè)三角形

所以看到這里,正方形又多了個(gè)構(gòu)建方式:按照途中坐標(biāo)點(diǎn)1243的順序傳入白华,然后繪制時(shí)選擇GL_TRIANGLE_STRIP的繪制方式慨默。
最后繪制結(jié)果如下:


繪制小結(jié)

GL_TRIANGLE_STRIP

由上面的注釋,我們可以知道弧腥,GL_TRIANGLE_STRIP的方式繪制連續(xù)的三角形厦取,比直接用GL_TRIANGLES的方式繪制三角形少好多個(gè)頂點(diǎn),效率會(huì)高很多管搪。另外虾攻,GL_TRIANGLE_STRIP并不是只能繪制連續(xù)的三角形構(gòu)成的物體,我們只需要將不需要重復(fù)繪制的點(diǎn)重復(fù)兩次即可更鲁。比如霎箍,傳入ABCDEEFFGH坐標(biāo),就會(huì)得到ABC澡为、BCD漂坏、CDE以及FGH四個(gè)三角形。

GL_TRIANGLE_FAN

扇面繪制是以第一個(gè)為零點(diǎn)進(jìn)行繪制,通常我們繪制圓形顶别,圓錐的錐面都會(huì)使用到谷徙,值得注意的是,最后一個(gè)點(diǎn)的左邊應(yīng)當(dāng)與第二個(gè)點(diǎn)重合驯绎,在計(jì)算的時(shí)候完慧,起點(diǎn)角度為0度,終點(diǎn)角度應(yīng)包含360度剩失。

頂點(diǎn)法和索引法

上述提到的繪制屈尼,使用的都是GLES20.glDrawArrays ,也就是頂點(diǎn)法赴叹,是根據(jù)傳入的定點(diǎn)順序進(jìn)行繪制的。還有一個(gè)方法進(jìn)行繪制GLES20.glDrawElements指蚜,稱之為索引法乞巧,是根據(jù)索引序列,在頂點(diǎn)序列中找到對(duì)應(yīng)的頂點(diǎn)摊鸡,并根據(jù)繪制的方式绽媒,組成相應(yīng)的圖元進(jìn)行繪制。
頂點(diǎn)法擁有的繪制方式免猾,索引法也都有是辕。相對(duì)于頂點(diǎn)法在復(fù)雜圖形的繪制中無(wú)法避免大量頂點(diǎn)重復(fù)的情況,索引法可以相對(duì)頂點(diǎn)法減少很多重復(fù)頂點(diǎn)占用的空間猎提。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末获三,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子锨苏,更是在濱河造成了極大的恐慌疙教,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伞租,死亡現(xiàn)場(chǎng)離奇詭異贞谓,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)葵诈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門裸弦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人作喘,你說(shuō)我怎么就攤上這事理疙。” “怎么了泞坦?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵沪斟,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng)主之,這世上最難降的妖魔是什么择吊? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮槽奕,結(jié)果婚禮上几睛,老公的妹妹穿的比我還像新娘。我一直安慰自己粤攒,他們只是感情好所森,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著夯接,像睡著了一般焕济。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盔几,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天晴弃,我揣著相機(jī)與錄音,去河邊找鬼逊拍。 笑死可帽,一個(gè)胖子當(dāng)著我的面吹牛中鼠,可吹牛的內(nèi)容都是我干的盈电。 我是一名探鬼主播叫编,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼缨恒!你這毒婦竟也來(lái)了谴咸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤骗露,失蹤者是張志新(化名)和其女友劉穎寿冕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椒袍,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驼唱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驹暑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玫恳。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖优俘,靈堂內(nèi)的尸體忽然破棺而出京办,到底是詐尸還是另有隱情,我是刑警寧澤帆焕,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布惭婿,位于F島的核電站不恭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏财饥。R本人自食惡果不足惜换吧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望钥星。 院中可真熱鬧沾瓦,春花似錦、人聲如沸谦炒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宁改。三九已至缕探,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間还蹲,已是汗流浹背爹耗。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秽誊,地道東北人鲸沮。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓琳骡,卻偏偏與公主長(zhǎng)得像锅论,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子楣号,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容