本文回顧了nurbs曲面基本性質,研究了nurbs曲面的繪製,並給出了任意nurbs曲面的繪製**及示例資料。
1. nurbs曲面
1.1 nurbs的兩種表示
這裡只介紹nurbs繪製中需要用到的一些基本知識。通常,乙個nurbs曲面f(s,t)包含三個要素:
控制頂點(x,y,z),節點序列(s,t)和權因子(w),
或者說是
帶權控制頂點(x*w,y*w,z*w,w)和節點序列(s,t)。
opengl中提供了對兩類曲面的繪製:
type=4:gl_map2_vertex_4
控制頂點帶權,每個點記為(x*w,y*w,z*w,w)
type=3:gl_map2_vertex_3
控制頂點權都為1,每個點記為(x,y,z)
第二種情況就是通常的b樣條曲面,本文**考慮的是第一種情況。
1.2 nurbs的基本關係式
假設曲面f(s,t)在s,t方向階數分別為sorder,torder,控制網格和節點序列分別為
glfloat ctrlpoints[s_count][t_count][type], //控制網格
glfloat sknot[sknot_count], //s節點序列
glfloat tknot[tknot_count], //t節點序列
那麼,opengl中,控制網格和節點序列的大小必須滿足
sknot_count = s_count + sorder
tknot_count = t_count + torder
2. nurbs曲面的繪製
opengl中的glunurbssu***ce()函式是繪製nurbs曲線曲面的關鍵函式,其函式原型定義如下
void glunurbssu***ce(
glunurbsobj * nobj, //nurbs曲面物件
glint sknot_count, //s方向節點數目
glfloat * sknot, //s方向節點陣列指標
glint tknot_count, //t方向節點數目
glfloat * tknot, //t方向節點陣列指標
glint s_stride, //s方向控制點資料跨度
glint t_stride, //t方向控制點資料跨度
glfloat * ctlarray, //控制點陣列指標
glint sorder, //s方向上多項式階數
glint torder, //t方向上多項式階數
glenum type //確定求值器型別
);該函式的引數包括:
2.1 nurbs物件: glunurbsobj *nobj
繪製nurbs曲面之前,必須建立乙個nurbs物件並設定其屬性,例如
nobj = glunewnurbsrenderer();
glunurbsproperty(nobj , glu_sampling_tolerance, 20);
glunurbsproperty(nobj , glu_display_mode, glu_fill);
2.2 曲線階數
glint sorder,
glint torder,
對應兩個方向的階數
2.3 節點序列
glint sknot_count,
glfloat * sknot,
glint tknot_count,
glfloat * tknot,
需要指定指標,陣列大小。
2.4 控制網格
glfloat * ctlarray,
glint s_stride,
glint t_stride,
a)這裡,控制網格被儲存到乙個一維陣列裡面,所以,如果我們定義控制網格為
glfloat ***ctrlpoints;
在非配空間時,我們必須保證整個網格資料儲存與乙個連續區域裡面。
b)假設控制網格為ctrlpoints[s_count][t_count][4]
如果控制網格以行優先儲存進入ctlarray,那麼
s_stride = 4 * t_count
t_stride = 4
反之,如果控制網格以列優先儲存進入ctlarray,那麼
s_stride = 4
t_stride = 4 * s_count
2.5 求值器型別
gl_map2_vertex_4
gl_map2_vertex_3
在本文附帶**中,該函式使用為
glubeginsu***ce(m_su***ce);
glunurbssu***ce(m_su***ce, m_knotsu.m_num, m_knotsu.m_knots, m_knotsv.m_num, m_knotsv.m_knots,
4*m_ctrlpoints.m_col, 4,&(m_ctrlpoints.data[0][0][0]), m_orderu,m_orderv, gl_map2_vertex_4);
gluendsu***ce(m_su***ce);
3. **及例子
介紹太多也沒用,有問題直接參考**就行了,本文附帶**是nurbs曲面的乙個繪製框架
關於**:
1) 生成的exe可以開啟data資料夾下面的例子
2) 左鍵進行旋轉,右鍵縮放
3) 下面是本文**的繪製結果
圖1 繪製的nurbs曲面
用as函式繪製EMF檔案
感謝老大和濤濤 這稱呼只有老大的老大才叫的,這裡放肆一下,嘿嘿 還有良勝。都是牛人的說.剛要做這個的時候,摸不清下手的點在 連emf檔案,向量繪圖,都不清楚是啥,as的繪圖函式壓根就沒用過,b s模式讀取檔案更是啥都不懂。當時想了兩條方向,要麼在瀏覽器這邊轉格式,要麼在服務端那邊轉完再發過來。根據f...
用python繪製詞云
開發環境 python2.7 需要的庫 wordcloud,jieba,matplotlib 通過jieba分詞將讀取的文字分成字串,通過wordcloud生成詞云,根據詞頻來顯示特色詞云,讓人更加直觀的明白文字的詞頻最大的文字 在寫 之前我們要引入庫 import sys from wordclo...
libgdx 用紋理繪製簡單介面
gamescreen public void render spritebatch.end 繪製紋理,完全可以認為繪製乙個,預設情況 public void draw textureregion region,int x,int y 繪製乙個字串 public void drawstring str...