OpenGL之貝賽爾(Bezier)曲面

OpenGL貝賽爾(Bezier)曲面

貝賽爾(Bezier)『曲面』與『曲線』相比不同之處在於多咗v空間域.曲面函式s(u,v).曲面演示程式按空格鍵在線框、填充、紋理模式中切換:下載

1.對曲面進行柵格映射

void glMap2f(GLenum target,GLfloat u1,GLfloat u2,GLint ustride,GLint uorder,GLfloat v1,GLfloat v2,GLint vstride,GLint vorder,const GLfloat *points);

函式示例:

glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3,u,  0,1, 3v,3,  (GLfloat)bezier->control_array);

參數 簡介
target 控制點類型
u1,u2 u空間域參數的定義域(u1~u2)
ustride u空間域頂點跨度
uorder u空間域頂點個數
v1, v2 v空間域參數的定義域(u1~u2)
vstride v空間域頂點跨度
vorder v空間域頂點個數
points 定點數組

 

控制點類型(target) 簡介
GL_MAP1_VERTEX_3 頂點座標(x,y,z)
GL_MAP1_VERTEX_4 頂點座標(x,y,z,w)
GL_MAP1_INDEX 顏色索引
GL_MAP1_COLOR_4 顏色值(RGBA)
GL_MAP1_NORMAL 法線座標
GL_MAP1_TEXTURE_COORD_1 紋理座標(s)
GL_MAP1_TEXTURE_COORD_2 紋理座標(s,t)
GL_MAP1_TEXTURE_COORD_3 紋理座標(s,t,r)
GL_MAP1_TEXTURE_COORD_4 紋理座標(s,t,r,g)

2.啟用貝賽爾(Bezier)曲面

glEnable(GL_MAP2_VERTEX_3);

3.定義定義均勻的柵格,並設置間隔個數

void glMapGrid2f(GLint un,GLfloat u1,GLfloat u2,GLint vn,GLfloat v1,GLfloat v2);

函式示例:

glMapGrid2f(10,0, 10, 10, 0, 10);

參數 簡介
un u域[u1~u2]間隔個數,必須為正
u1 u1=0
u2 u2=un
vn v域[v1~v2]間隔個數,必須為正
v1 v1=0
v2 v2=vn
  1. 根據柵格設置繪製曲面

void glEvalMesh2(GLenum mode,GLint i1,GLint i2,GLint j1,GLint j2);

函式示例:

glEvalMesh2(GL_FILL, 0, 10, 0, 10);

參數 簡介
mode 繪畫模式

GL_POINT:點

GL_LINE:直線

GL_FILL:填充

i1,i2 u空間域的範圍
j1,j2 v空間域的範圍

5.為曲面生成法線用於光照

glEnable(GL_AUTO_NORMAL);

6.對曲面進行紋理映射

glMap2f(GL_MAP2_TEXTURE_COORD_2, 0,1,2, 2,0,1, 4,2,(GLfloat*)bezier->texture_coord);

對曲面進行紋理映射glMap2f() 簡介
target 紋理座標(s,t):GL_MAP2_TEXTURE_COORD_2(睇上表)
u1,u2 s空間域:[0~1]
ustride s紋理座標頂點跨度:2
uorder s空間域頂點個數:2
v1,v2 t空間域:[0~1]
vstride t紋理座標頂點跨度:4
vorder t空間域頂點個數:2
points 紋理座標:{0.0, 0.0}, {0.0, 1.0}, {1.0, 0.0}, {1.0, 1.0}

4.啟用曲面紋理座標

glEnable(GL_MAP2_TEXTURE_COORD_2);

OpenGL之貝賽爾(Bezier)曲線

OpenGL貝賽爾(Bezier)曲線

OpenGL支持貝賽爾(Bezier)曲線繪畫,貝賽爾曲線由起點,終點和控制點組成,並且具有平滑的運動軌跡.控制點用於定義曲線的形狀,像磁石將曲線向控制點的位置吸引.上圖的演示程式通過滑鼠點選屏幕放置『控制點』繪畫貝賽爾(Bezier)曲線.ESC鍵清空『控制點』:下載

1.設置貝賽爾(Bezier)曲線

void glMap1f(GLenum target,GLfloat u1,GLfloat u2,GLint stride,GLint order,const GLfloat *points);

參數 簡介
target 控制點類型
u1, u2 u參數的定義域(0~1)
stride 頂點跨度
order 曲線頂點個數(由起點,終點和控制點組成)
points 指向曲線頂點數組由(起點,終點和控制點組成)

 

控制點類型(target) 簡介
GL_MAP1_VERTEX_3 頂點座標(x,y,z)
GL_MAP1_VERTEX_4 頂點座標(x,y,z,w)
GL_MAP1_INDEX 顏色索引
GL_MAP1_COLOR_4 顏色值(RGBA)
GL_MAP1_NORMAL 法線座標
GL_MAP1_TEXTURE_COORD_1 紋理座標(s)
GL_MAP1_TEXTURE_COORD_2 紋理座標(s,t)
GL_MAP1_TEXTURE_COORD_3 紋理座標(s,t,r)
GL_MAP1_TEXTURE_COORD_4 紋理座標(s,t,r,g)

2.啟用控制點

glEnable(GL_MAP1_VERTEX_3);

3.現在可以繪畫曲線,100條直線繪畫貝賽爾(Bezier)曲線,以均等間隔繪畫.

glBegin(GL_LINE_STRIP);

for (i = 0; i <= 100; ++i)

glEvalCoord1f((float)i / 100.0f);

glEnd();

上面的代碼可以簡化為

glMapGrid1d(100, 0.0f, 1.0f);// 定義定義均勻的間格

glEvalMesh1(GL_LINE,0, 100);// 繪製曲線

4.完成繪畫後需要繪畫控制點

glPointSize(5);

glBegin(GL_POINTS);

for (i = 0; i < bezier->countol_count; ++i)

           glVertex3fv(bezier->control_array[i].M);

glEnd();

 

OpenGL之二次曲面

OpenGL之二次曲面

如果要繪製『球體』,『圓柱』,『圓錐』,『圓盤』除了可以自已編寫圖形庫.還可以時用OpenGL Utility Library(OpenGL實用庫)提供的高級圖形支持.簡稱為GLUT.要下載可到官網下載: https://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip 但windows版只支持x86.演示程式:下載

1.創建二次曲面對象,成功返回指向二次曲面的指針,否則返回NULL

GLUquadric*gluNewQuadric(void);

2.設置繪製風格

void gluQuadricDrawStyle(GLUquadric *quadObject,GLenum drawStyle);

drawStyle(繪畫樣式) 簡介
GLU_FILL 實體填充渲染
GLU_LINE 以線框模式渲染
GLU_SILHOUETTE 以輪框模式渲染,排除多邊形的共線.
GLU_POINT 以頂點模式渲染

3.設置法線生成

法線狀態用於設置二次曲面的表面法線的生成方式.

void WINAPI gluQuadricNormals(GLUquadric *quadObject,GLenum normals);

Normals(法線狀態) 簡介
GLU_NONE 不生成法線
GLU_FLAT 每個多邊形生成一個法線(單調明暗處理)
GLU_SMOOTH 每個頂點生成一個法線(平滑明暗處理) (默認值)

3.設置法線方向

設置生成法線的方向,內部還是外部.

Void gluQuadricOrientation(GLUquadric *quadObject,GLenum orientation);

Orientation(方向) 簡介
GLU_OUTSIDE 法線指向外側(默認值)
GLU_INSIDE 法線指向內側

4.設置紋理座標

紋理狀態是否為圖形生成紋理座標

void gluQuadricTexture(GLUquadric *quadObject,GLboolean textureCoords);

textureCoords 簡介
GL_TRUE 生成紋理座標
GL_FALSE 不生成紋理座標(默認值)

5.當不使用二次曲面後需要釋放資源

void gluDeleteQuadric(GLUquadricObj *state);

 

二次曲面繪畫

1.繪畫偏平的圓盤,中間可以有個圓孔

void gluDisk(GLUquadric *qobj,GLdouble innerRadius,GLdouble outerRadius,GLint slices,GLint loops);

繪畫偏平的扇形圓盤

void gluPartialDisk(GLUquadric *qobj,GLdouble innerRadius,GLdouble outerRadius,GLint slices,GLint loops,GLdouble startAngle,GLdouble sweepAngle);

參數 簡介
qobj 二次曲面對象
innerRadius 內圓直徑,若為0則是閉孔,大於零則中心有個孔
outerRadius 外圓直徑
Slices 繞z軸的細分數.此值越大圓盤越圓
Loops 同軸圓盤的邊形細分數
startAngle 扇形起此角度
sweepAngle 扇形圓弧角度

2.繪畫圓錐和圓柱

void gluCylinder(GLUquadric *qobj,GLdouble baseRadius,GLdouble topRadius,GLdouble height,GLint slices,GLint stacks);

分別有底座半徑與柱頂半徑若其一為0為圓錐,若兩值不相等則為錐形圓柱,若兩值相等則為圓柱. 底座圓面與柱頂圓面是繪畫的,你需要使用gluDisk()另外繪畫

圓柱沿Z軸繪畫,底座為於Z=0, 柱頂位於Z=height(高度)

參數 簡介
qobj 二次曲面對象
baseRadius 底座半徑 z=0
topRadius 柱頂半徑z=height
height 圓柱的高度
slices 繞Z軸的細分數.此值越大圓柱越圓
stacks 延Z軸的細分數.此值越高返射光的效果越好.

3.繪畫球體,按給定半徑以原點為中心進行繪製

void gluSphere(GLUquadric *qobj,GLdouble radius,Glint slices,GLint stacks);

參數 簡介
qobj 二次曲面對象
radius 球體的半徑
slices 繞z軸的細分數(相當於經線)
stacks 沿z軸的細分數(相當於緯線)

 

Windows10之滑鼠衝突

Windows10之滑鼠衝突

近日發現Windows10下的滑鼠出現奇怪問題,如『開始畫面』點選無反應(重新關開滑鼠可恢復).瀏覽器的tab分頁自動切換(跳轉).這種現象又唔似中毒,霖左好幾日.因為貪方便裝左兩隻無線滑鼠問題才出現的.果斷拔掉一隻滑鼠所有問題都自動消失.原來是兩隻無線滑鼠(Logitech&Microsoft)衝突引起.

仿生蜘蛛

仿生蜘蛛
仿生蜘蛛

之前介紹『六腳類蜘蛛』機器人雖然可以行走並翻滾,但它的關節非常粗.與德國festo(費斯托) 的『仿生蜘蛛』(BionicWheelBot)相比就差太遠.『仿生蜘蛛』通過模仿摩洛哥後翻蜘蛛(cebrennus rechenbergi)的轉身與翻滾.通過wifi使用平板電腦進行控制.

身驅和長腿使用尼龍進行3D打印,但細睇之下有點唔似.因為尼龍的熔點比ABS更好,收縮比ABS更大,打印較大尺寸效果唔是很好.而且光潔度極高睇唔到線材的紋路.似模具內噴砂.

『仿生蜘蛛』共有8只腳,每只腳的膝關節和肩關節都裝有彈簧,與15個小型馬達.行走與轉身時只用六隻尖腳,中間的一對支腳收在腹下.每走一步三隻尖腳支撐並穩定身體,另外三隻尖腳提高並前移然後落地.轉身時中間一對尖腳作為支撐,另外四隻尖腳離地完成轉身.但行走速度有待提高.

如果『仿生蜘蛛』要進行翻滾動作,將六隻尖腳收起變為『車輪』,將平時收在腹下的只支腳伸出,通過不斷伸腿進行翻滾,向前伸就後翻,向後伸就前翻.甚至在一定坡度(5度)下翻滾,速度要比行走快得多.

但『仿生蜘蛛』結構比較複雜,即使量產售價也比較高.

特幀 數值
身長 展開570mm
身高 企高238mm
身寬 展開796mm
腳長 344mm
Gauge 164 mm
車輪直徑 267mm
關節 15個馬達
材料:身驅和腿 使用尼龍進行3D打印
電池 鋰電池7.4伏1000毫安
無線電模塊 866 MHz(WIFI)
無線電遙控 平板電腦
處理器 STM32F4
驅動器 14×自動鎖緊蝸輪單元
傳感器 1×BNO055絕對定向傳感器

 

仿生狐蝠

仿生狐蝠
仿生狐蝠

德國festo(費斯托) 的『仿生海鷗』通氦氣的浮力和兩翼的拍打在空中飛行.而最新的『仿生狐蝠』更無需注入氦氣.通過模擬『狐蝠』的特徵倒掉在半空,然後展翼並跳下.接著震翼在空中自主飛翔

狐蝠(Flying Fox)也是一種蝙蝠.而蝙蝠的特徵是具有彈性的翼膜,翼膜從指骨一直延伸至腳骨.在飛行時用指骨控制翼膜的曲率,即使在慢速飛行時也能獲得足夠最大爬升力『仿生狐蝠』通過『馬達』與『變速箱』不斷震動兩翼以此提供足夠爬升力.

festo(費斯托)研製出薄輕但極有韌性織物,由兩塊氣密薄膜和一塊氨綸織物組成.通過蜂窩結構織造的翼膜有45000個織造點.即使翼膜出現裂紋也不會擴大.即使翼膜出現部分損傷『仿生狐蝠』也能繼續飛行.而且由於翼膜具有極強彈性,即使收起雙翼時也不會褶皺.而且可以分別對單翼進行折疊.

喂一不足的是需通過地面的2部紅外攝像機,捕足兩翼與後肢來識別『仿生狐蝠』的運動.然後計算飛行路徑並引導『仿生狐蝠』的整個飛行過程

『仿生狐蝠』兩翼展開228cm,體長87cm,而體重僅580g.兩米多翼展而體重只有一斤多一點. 這樣『仿生狐蝠』兩翼負載即低而且結構簡單. 如果festo(費斯托)量產『仿生狐蝠』其銷量肯定會超過航拍無人機.

結構 參數
翼幅 228 cm
體長 87 cm
體重 580g
雙翼財料 碳纖維
翼展面積 蜂窩結構織物
機身外殼 泡沫
馬達 40瓦無刷電機
運動跟蹤系統 2部紅外攝像機

 

 

OpenGL之模板緩存

OpenGL之模板緩存

使用『模板緩存』可以將屏幕中的某些部分從視野中屏蔽.其中的特效是『鏡像』效果.鏡像(倒影)演示程式:下載

1.設置像素格式時對PIXELFORMATDESCRIPTOR對cStencilBits設置為 16bit『模板緩存』.

PIXELFORMATDESCRIPTOR pdf;

pfd.cStencilBits = 16;

2.要啟用『模板緩存』

glEnable(GL_STENCIL_TEST);

3.設置模板操作

void glStencilOp(GLenum fail,GLenum zfail,GLenum zpass);

fail:模板測試失敗

zfail:模板測試通過,但深度測試失敗

zpass:模板測試與深度測試均通過

操作 簡介
GL_KEEP 保持當前值
GL_ZERO 將模板緩存的值設定為0
GL_REPLACE 將模板緩存的值設定為glStencilFunc()的參考值ref.
GL_INCR 增加當前模板的緩存值
GL_DECR 減小當前模板的緩存值
GL_INVERT 將模板緩存的值反轉

4.設置模板比較程序

void glStencilFunc(GLenum func,GLint ref,GLuint mask);

func:比較程式

ref:參考值

mask:模板掩碼

比較程式 簡介
GL_NEVER 總是失敗
GL_LESS 條件比較:if (ref & mask) < (stencil & mask).
GL_LEQUAL 條件比較:if (ref & mask) ≤ (stencil & mask).
GL_GREATER 條件比較:if (ref & mask) > (stencil & mask).
GL_GEQUAL 條件比較: if (ref & mask) ≥ (stencil & mask).
GL_EQUAL 條件比較: if (ref & mask) = (stencil & mask).
GL_NOTEQUAL 條件比較: if (ref & mask) ≠ (stencil & mask).
GL_ALWAYS 總是允許

繪畫鏡像函式代碼演示:

1.禁用深度測試

glDisable(GL_DEPTH_TEST);

2.禁用對所有的然色分量的修改

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);

3.啟用模板測試

glEnable(GL_STENCIL_TEST);

4.將地板繪製到模板緩存中,引用參考值ref

glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);

glStencilFunc(GL_ALWAYS, 1, 1);

5.繪畫地板後雖然還未睇到地板,但已在模板緩存中生成孔,在孔中的多邊形將不被繪製

Draw_Floor();

6.啟用所有顏色分量的修改

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);

7.啟用深度測試

glEnable(GL_DEPTH_TEST);

8.設置模板比較程序,只能在模板緩存中值為1的相應去區域繪製

glStencilFunc(GL_EQUAL, 1, 1);

glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

9.壓入模型矩陣.準備繪製”鏡像”

glPushMatrix();

10.返轉境像

glScalef(1.0f, -1.0f, 1.0f);

11.繪畫鏡像(倒影)

Draw_Mirror();

11.彈出模型矩陣結束鏡像繪製

PopMatrix();

12.禁用模板測試

glDisable(GL_STENCIL_TEST);

13.以50%繪製透明地板, 啟用混合

glEnable(GL_BLEND);

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

glColor4f(1.0f,1.0f,1.0f,0.5f);

14.繪畫地板

Draw_Floor();

15.禁用混合

glDisable(GL_BLEND);

 

波士頓動力之Atlas

波士頓動力之Atlas
波士頓動力之Atlas

『Atlas』是波士頓動力研發雙足仿真機器人.其控制系統通過協調手臂,軀幹和雙腿,實現『搬箱』(唔可以太重最多搬起一包米)『跳上』『跳落』『空中360度轉體』『後空翻』等動作. (後空翻好多人都做唔到)

『Atlas』通過3D打印技術使其更輕更緊湊,讓液壓系統置於腿部.並重新設計更輕巧的步進馬達.使其具有高強度外殼和低重量比.通過『立體視覺』,『距離感應』和其他傳感器使『Atlas』能在其崎嶇地面上步行.並在『推』『撞』下保持平衡.就算跌低都可以爬起身.

參數 數值
高度 1.5m
體重 75kg
負重 11kg
動力 電動
驅動 液壓
感知 激光雷達與三維視覺系統
關節 28個

 

 

波士頓動力之Handle

波士頓動力之Handle
波士頓動力之Handle

『Handle』是美國波士頓動力種製作的機器人,它將兩個車輪裝在雙腿,結合波士頓動力之前製作的『四足動物』和『兩足機器人』的動力學、平衡和移動操縱原理.它的結構非常簡單只有10個驅動關節.車輪在崎嶇地表都能高速走動『落斜』『落樓梯』『自轉』『單邊橋』『跳欄』.雙腿幾乎可以在任何地方行走.比起通過雙腿或四足走動的機器人更高效.通過雙腿與車輪結合『Handle』具有兩全其美的優點.充滿電後大約可行使24km.
『Handle』通過液壓制動可以拿起超過45KG(100磅)的負重,但雙腿卻很細可以在狹小的空間內移動.所有關節都自動進行了協調,實現高難度動作.如果量產搬運工要失業.

參數 數值
高度 2m
體重 105kg
速度 14.5km/h
跳高 1.2米
負重 45kg
動力 電池
驅動 液壓與電動
感知 深度相機
關節 10個

 

 

波士頓動力之SpotMini

波士頓動力之SpotMini
波士頓動力之SpotMini

SpotMini是波士頓動力公司設計的小型四足機器人,可在家居和辦公環境靈活走動.它有兩個版本,無頭版只重25kg,裝上『雞頭』也只是30kg.完全使用電池作為動力,是波士頓動力目前最安靜的計器人.完全充電後可以活動90分鐘.

SpotMini繼承了它的大佬SPOT的所有機動性, 而且增加五軸自由活動的手臂.和增強型傳感器拾取物體和處理物體的能力.傳感器裝置包括『立體相機』、『深度相機』、『姿態測量器』以及裝在四肢的『位置傳感器』與『力量傳感器』.這些傳感器都有助於加強SpotMini導航和移動的操控能力.

更示範『無頭SpotMini』因開唔到門而Call『雞頭SpotMini』開門的過程.然後一起通過.

參數 數值
高度 0.84m
體重 30kg
負重 14kg
動力 電池
驅動 電動
感知 三維視覺系統
關節 17個