opengl畫圓柱體 圓錐等並使用四元數旋轉

2021-10-10 02:51:03 字數 2295 閱讀 9798

如要畫出想畫的立方體,必須計算出來頂點陣列物件,並且根據頂點定義的位置,簡歷索引關係,進而使用createglresources函式完成繪畫。

我們可以將底面的圓看成是一條直線繞乙個頂點旋轉,這樣旋轉一定的角度後,另乙個定點的位置即所要求的頂點座標。若我們分的夠多,即旋轉角度設立的越小,越相似於圓形。(類似於古代割圓術的思想)

即,問題可以轉換為:

a點(x, y)按順時針旋轉 theta 角度後點的座標為a1點(x1,y1) ,求x1 y1座標用(x,y)和 theta 來表示。

解題方法:

設 oa 向量和x軸的角度為 alpha ,那麼順時針轉過 theta後 ,oa1 向量和x軸的角度為 (alpha - theta) 。使用圓的引數方程來表示點座標。a的座標可以表示為:

a1的座標可以表示為(帶入a點座標進行化簡)

在**中,我們設定乙個函式,傳入引數為底面圓的半徑、割圓的線段個數、圓錐高度,之後通過上述的公式計算出頂點的座標,我使用的是【原點+底面圓上頂點+圓錐上邊的點】的順序構建的。

為了提公升效能,因此要少使用迴圈。在計算頂點座標的過程中即可以完成對頂點索引的構建。

即在計算所得圓上頂點數為1時,1與最後乙個頂點,即輸入的割圓最後乙個點,這兩個頂點和底面圓中心點構建乙個三角形,和圓錐頂點構建第二個三角形;

頂點數超過2時,以此兩個頂點,加上底面圓中心點構建第乙個三角形,加上圓錐頂點構建第二個三角形,以此類推,沒加乙個頂點就加兩個三角形的索引。最後完成索引構建。

void cmesh:

:createcone

(float radius,

int num_stacks,

float height)

; vertices[0]

.color =

; vertices[1]

.color =

; vertices[num_vertices -1]

.pos = vec3

;int num_angle =1;

for(

int i =

0; i < num_stacks;

++i)

else

if(i ==0)

}createglresources

(vertices, indices)

; delete[

] vertices;

delete[

] indices;

}

實現效果在新增了右鍵響應選單後,可看出實現效果如下:

實現時遇到的問題:

在實現的過程中,要注意索引的順序,如果某乙個三角形索引順序出現問題,可能相出現如下的畫不出的問題。

畫圓柱和圓錐類似,只不過是新增了一組z方向為高度的頂點,並且以圓錐頂點為中心,和新加頂點畫出三角,以此完成兩個圓,之後再降上下圓的頂點聯絡起來,畫出側面。

具體實現原理與圓錐類似,不同點為:在生成每個頂點時,依託此頂點要完成12條索引,即上下圓生成的三角形、側面生成的兩個三角形,共4個三角形12個頂點索引。

void cmesh:

:createcylinder

(float radius,

int num_stacks,

float height)

; vertices[0]

.color =

; vertices[1]

.color =

; vertices[num_vertices -1]

.pos = vec3

;int num_angle =1;

for(

int i =

0; i < num_stacks;

++i)

else

if(i ==0)

}createglresources

(vertices, indices)

; delete[

] vertices;

delete[

] indices;

}

實現效果

在新增了右鍵響應選單後,可看出實現效果如下:

opengl空間畫圓柱體

介紹 由於opengl庫里並沒有函式直接在三維空間繪製圓柱形的函式,所以需要用一種方法來實現在三維空間繪製圓柱體。基本思路 要在空間ab兩點間繪製乙個圓柱體,可以先在y軸上畫乙個同等長度的圓柱,然後旋轉平移到ab就可以了。void cylinder float x0,float y0,float z...

圓柱體計算

problem description 已知圓柱體的底面半徑r和高h,計算圓柱體底面周長和面積 圓柱體側面積以及圓柱體體積。其中圓周率定義為3.1415926。input 輸入資料有一行,包括2個正實數r和h,以空格分隔。output 輸出資料一行,包括圓柱體底面周長和面積 圓柱體側面積以及圓柱體體...

圓柱體計算

圓柱體計算 description 已知圓柱體的底面半徑r和高h,計算圓柱體底面周長和面積 圓柱體側面積以及圓柱體體積。其中圓周率定義為3.1415926。input 輸入資料有一行,包括2個正實數r和h,以空格分隔。output 輸出資料一行,包括圓柱體底面周長和面積 圓柱體側面積以及圓柱體體積,...