2011-06-04 38 views
3

我使用gluNurbsCurve繪製了一些控制點的曲線。我有紅色書中描述的基本設置正確工作,我正在努力擴展它。
此示例如下:繪製NURBS曲線時結的意義?

float knots[8] = {0,0,0,0,1,1,1,1}; 
float pnts[4][3] = { {...},{...},{...},{...} }; 
GLUnurbsObj *m = gluNewNurbsRenderer(); 
gluBeginCurve(n); 
gluNurbsCurve(n, 8, knots, 3, pnts, 4, GL_MAP1_VERTEX_3) 
gluEndCurve(n); 

有一件事我想知道的是疙瘩數據的含義。它如何影響結果?我可以在那裏做什麼其他選擇?
出於某種原因,我找不到任何教程正確解釋這一點。

回答

3

實際上有充足的網站在線解釋結矢量。這不是GL特定的事情,而是NURBS的固有屬性。因此,在谷歌輸入「NURBS結矢量」會得到你詳細的解釋。

我只是說,通常結矢量的長度爲knot-vector-length = number-of-points + degree-of-curve + 1,唯一重要的是比例而不是絕對值。所以{0,1,2,3}是一樣的在我看來{0,2,4,6}

最重要的節點向量是這些:

1){0,1,2,3,4,5,6,...}

,這將讓你,如果你重複使用曲率連續性很容易地擴展曲線最後(或第一個)degree-of-curve-1點,但這意味着該曲線實際上並未貫穿其開始點和結束點,因此您必須重複上一個(或第一個)degree-of-curve-1點以創建一個連續的閉合曲線。

另一個重要的形式是

2){0,0,0,1,2,3,...,n,n,n}

0在開始和n在末端重複degree-of-curve + 1倍。這也是你使用的形式。這將爲您提供NURBS曲線,該曲線從第一個點開始並在您指定的最後一個點結束。但它只能提供位置連續性。所以如果你用這個做一個閉合曲線,那麼你很有可能得到一個切向不連續性。

Btw。如果你只有degree-of-curve + 1分,並使用第二種形式,那麼你只有0 s和1 s。結果樣條將與Bézier曲線相同。

這是真的很難沒有圖像或數學背景(伯恩斯坦多項式)

0
A knot vector is the curve parameter at which the continuity changes. Try to 

瞭解「貝塞爾」曲線書面解釋。我們可以創建一個曲線,其度數爲num_control_points - 1。因此,對於具有4個控制點的貝塞爾曲線。我們會得到3級曲線(順序= 4)。所以這條曲線的任何地方。連續性將是C2,這意味着曲率的連續性。該曲線的結矢量將是(0,0,0,0,1,1,1,1)。這是你上面給出的代碼片段。你已經提供了結矢量和曲線的控制點。

所以,人們可以知道在參數0處有C0連續性。參數1相同。 參數的結點數越多。這意味着該參數的連續性是 減少。希望你明白我在講什麼。由於曲線的程度爲3.連續性從(C3→C2→C1→C0)下降。這就是(0 - > 0 - > 0 - > 0)代表 。

我仍在研究(學習:P)如何在統一結矢量的情況下,曲線開始於某個中途。就目前而言,假設結矢量爲(0,1,2,3..7)的情況。這表明參數0 - 1之間有一條曲線。在1 - 2之間,還有另一個。所以基本上我們把整條曲線分成7塊(當然,程度取決於你)。如果我把它作爲3度曲線。這意味着我有7個不同的曲線,每個曲度3度。

希望你跟着我說的。作爲第1步,嘗試理解結矢量的含義,第2步將是如何在Cox De-Boor遞歸方程中使用這些結構(它會有點複雜)。最後你會看到什麼重量的意思。這就是縮寫NURBS(非均勻合理化B樣條)中「R」的原因。你給出的片段是Uniform B樣條曲線。所以基本上,NURBS只是任何可能的曲線的集合。 :)