【嘮叨】
成都創(chuàng)新互聯(lián)公司服務(wù)項目包括沂源網(wǎng)站建設(shè)、沂源網(wǎng)站制作、沂源網(wǎng)頁制作以及沂源網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,沂源網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到沂源省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!繪圖的方式有兩種:
> 使用OpenGL的繪圖原語DrawPrimitives。
> 使用DrawNode。
曾經(jīng)在使用2.x版本的時候,學習過使用DrawPrimitives進行簡單圖形的繪制。
OpenGL繪圖原語DrawPrimitives,詳見:http://shahdza.blog.51cto.com/2410787/1545462
在本節(jié)中將學習使用DrawNode來進行圖形的繪制。
【致謝】
http://blog.csdn.net/ac_huang/article/details/39522473
http://blog.csdn.net/conmajia/article/details/8543834 (貝塞爾曲線的原理)
【小知識】
分段數(shù) :即繪制曲線一般都是通過繪制“樣條曲線”來實現(xiàn),而分段數(shù)即樣條段數(shù)。
二次貝塞爾曲線 :起點終點之間的一條拋物線,利用一個控制點來控制拋物線的形狀。
三次貝塞爾曲線 :起點終點之間,利用兩個控制點來控制曲線的形狀。
【v3.3】
DrawNode:添加了和 DrawPrimitives 一樣的功能,同時 DrawPrimitives 標識為棄用。
DrawPrimitives用法,參見:http://shahdza.blog.51cto.com/2410787/1545462
對于v3.3新增的函數(shù),參見本文最后的《附錄》。函數(shù)用法將不做贅述,參見DrawPrimitives用法即可。
【DrawNode】
DrawNode由于在一個單獨的批處理中繪制了所以元素,因此它繪制點、線段、多邊形都要比“drawing primitives”快。
> 使用DrawPrimitives繪圖原語繪制的圖形,可以是實心的,也可以是空心的。
> 使用DrawNode繪制的圖形都是實心的。
1、使用方法
創(chuàng)建一個DrawNode,然后加入到Layer布景層中,即可繪制各種形狀的圖形。
使用方法如下:
// //創(chuàng)建DrawNode,然后后加入到Layer層中 DrawNode* drawNode = DrawNode::create(); this->addChild(drawNode); //...基本圖形繪制... //
2、基本圖形繪制
使用DrawNode來繪制圖形,可以繪制如下幾個圖形。
> 圓點 :drawDot
> 線段 :drawSegment
> 三角形 :drawTriangle
> 多邊形 :drawPolygon
> 二次貝塞爾圖形 :drawQuadraticBezier
> 三次內(nèi)塞爾圖形 :drawCubicBezier
注:繪制的圖形都是實心的。
使用方法如下:
// //圓點 ('位置' , '圓點半徑' , '填充顏色') void drawDot(const Vec2 &pos, float radius, const Color4F &color); //線段 ('起點' , '終點' , '半線寬' , '填充顏色') void drawSegment(const Vec2 &from, const Vec2 &to, float radius, const Color4F &color); //三角形 ('頂點1' , '頂點2' , '頂點3' , '填充顏色') void drawTriangle(const Vec2 &p1, const Vec2 &p2, const Vec2 &p3, const Color4F &color); //多邊形 ('頂點數(shù)組' , '頂點個數(shù)' , '填充顏色' , '輪廓粗細' , '輪廓顏色') void drawPolygon(Vec2 *verts, int count, const Color4F &fillColor, float borderWidth, const Color4F &borderColor); //二次貝塞爾圖形 ('起點' , '控制點' , '終點' , '分段數(shù)' , '填充顏色') void drawQuadraticBezier(const Vec2& from, const Vec2& control, const Vec2& to, unsigned int segments, const Color4F &color); //三次貝塞爾圖形 ('起點' , '控制點1' , '控制點2' , '終點' , '分段數(shù)' , '填充顏色') void drawCubicBezier(const Vec2& from, const Vec2& control1, const Vec2& control2, const Vec2& to, unsigned int segments, const Color4F &color); //
3、清除繪圖緩存
使用clear(),來清除之前使用drawNode畫的所有圖形。
// drawNode->clear(); //
4、顏色混合方式
使用setBlendFunc(const BlendFunc &blendFunc),設(shè)置顏色混合的方式。
詳見:http://shahdza.blog.51cto.com/2410787/1547633
// BlendFunc bl = { GL_ONE, GL_ONE }; drawNode->setBlendFunc(bl); //
5、空心多邊形繪制
使用DrawNode繪制的圖形都是實心的,那么空心的怎么繪制呢?
從繪制圖形的函數(shù)可以看出:圖形繪制的同時,需要設(shè)置圖形的顏色Color4F,其中也包含了透明度的設(shè)置。所以只要控制圖形內(nèi)部的填充顏色Color4F的透明度為透明(值為0),即可繪制出一個空心的圖形來。
而能達到這種效果的,就只有多邊形的繪制:drawPolygon。
使用舉例:
> Color4F(1, 0, 0, 0) :紅色透明
> Color4F(1, 0, 0, 1) :紅色不透明
// Vec2 point[4]; point[0] = Vec2(100, 100); point[1] = Vec2(100, 200); point[2] = Vec2(200, 200); point[3] = Vec2(200, 100); //繪制空心多邊形 //填充顏色:Color4F(1, 0, 0, 0), 透明 //輪廓顏色:Color4F(0, 1, 0, 1), 綠色 drawNode->drawPolygon(point, 4, Color4F(1, 0, 0, 0), 1, Color4F(0, 1, 0, 1)); //
【代碼實戰(zhàn)】
> 圓點
> 線段
> 三角形
> 實心多邊形
> 空心多邊形
> 二次貝塞爾圖形
> 三次貝塞爾圖形
> 顏色混合測試 { GL_ONE , GL_ONE}
// //創(chuàng)建DrawNode DrawNode* drawNode = DrawNode::create(); this->addChild(drawNode); //圓點 drawNode->drawDot(Vec2(50, 50), 10, Color4F::RED); //線段 drawNode->drawSegment(Vec2(20, 100), Vec2(100, 100), 5, Color4F(0, 1, 0, 1)); drawNode->drawSegment(Vec2(20, 150), Vec2(100, 150), 10, Color4F(0, 0, 1, 1)); //三角形 drawNode->drawTriangle(Vec2(20, 250), Vec2(100, 300), Vec2(50, 200), Color4F(1, 1, 0, 1)); //實心多邊形 Vec2 point1[4]; point1[0] = Vec2(150, 50); point1[1] = Vec2(150, 150); point1[2] = Vec2(250, 150); point1[3] = Vec2(250, 50); drawNode->drawPolygon(point1, 4, Color4F(1, 0, 0, 1), 1, Color4F(0, 1, 0, 1)); //空心多邊形 Vec2 point2[4]; point2[0] = Vec2(150, 200); point2[1] = Vec2(150, 300); point2[2] = Vec2(250, 300); point2[3] = Vec2(250, 200); drawNode->drawPolygon(point2, 4, Color4F(1, 0, 0, 0), 1, Color4F(0, 1, 0, 1)); //二次貝塞爾 Vec2 from1 = Vec2(300, 20); Vec2 to1 = Vec2(450, 20); Vec2 control = Vec2(360, 100); drawNode->drawQuadraticBezier(from1, control, to1, 100, Color4F::ORANGE); //三次貝塞爾 Vec2 from2 = Vec2(300, 100); Vec2 to2 = Vec2(450, 100); Vec2 control1 = Vec2(350, 0); Vec2 control2 = Vec2(400, 200); drawNode->drawCubicBezier(from2, control1, control2, to2, 100, Color4F::YELLOW); //顏色混合測試 BlendFunc bl = { GL_ONE, GL_ONE }; drawNode->setBlendFunc(bl); drawNode->drawSegment(Vec2(300, 250), Vec2(450, 250), 10, Color4F::GREEN); drawNode->drawTriangle(Vec2(300, 200), Vec2(400, 300), Vec2(450, 150), Color4F::RED); //
截圖:
分析:
(1)可以看出,繪制的圖形全部都是實心的。
(2)繪制的線段兩邊端點是一個半圓,這是因為線段是通過圓點畫出來的。
(3)看到中間的兩個矩形,一個是實心的,一個是空心的。
(4)實心的貝塞爾圖形,看起來好奇怪啊。
【附錄】
v3.3中添加了和 DrawPrimitives 一樣的功能,同時 DrawPrimitives 標識為棄用。
新增函數(shù)如下:
// // 一個點、多個點 // 正方形小點 void drawPoint(const Vec2& point, const float pointSize, const Color4F &color); void drawPoints(const Vec2 *position, unsigned int numberOfPoints, const Color4F &color); void drawPoints(const Vec2 *position, unsigned int numberOfPoints, const float pointSize, const Color4F &color); // 線 void drawLine(const Vec2 &origin, const Vec2 &destination, const Color4F &color); // 矩形、四邊形 // Solid表示實心 void drawRect(const Vec2 &origin, const Vec2 &destination, const Color4F &color); void drawRect(const Vec2 &p1, const Vec2 &p2, const Vec2 &p3, const Vec2& p4, const Color4F &color); void drawSolidRect(const Vec2 &origin, const Vec2 &destination, const Color4F &color); // 多邊形 // Solid表示實心 void drawPoly(const Vec2 *poli, unsigned int numberOfPoints, bool closePolygon, const Color4F &color); void drawSolidPoly(const Vec2 *poli, unsigned int numberOfPoints, const Color4F &color); // 橢圓 // Solid表示實心 void drawCircle(const Vec2 ¢er, float radius, float angle, unsigned int segments, bool drawLineToCenter, const Color4F &color); void drawCircle( const Vec2& center, float radius, float angle, unsigned int segments, bool drawLineToCenter, float scaleX, float scaleY, const Color4F &color); void drawSolidCircle(const Vec2& center, float radius, float angle, unsigned int segments, const Color4F& color); void drawSolidCircle(const Vec2& center, float radius, float angle, unsigned int segments, float scaleX, float scaleY, const Color4F &color); // 樣條曲線 void drawCardinalSpline(PointArray *config, float tension, unsigned int segments, const Color4F &color); void drawCatmullRom(PointArray *points, unsigned int segments, const Color4F &color); //
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。