用VC OpenGL繪製NURBS曲面

2021-04-13 04:23:06 字數 3053 閱讀 8154

本文回顧了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...