如要畫出想畫的立方體,必須計算出來頂點陣列物件,並且根據頂點定義的位置,簡歷索引關係,進而使用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 輸出資料一行,包括圓柱體底面周長和面積 圓柱體側面積以及圓柱體體積,...