2012-06-04 55 views
1

我想在Bézier曲面上製作程序,我在互聯網上找到this article,有一種方法如何做到這一點,但我並不明白第二步,特別是第三步。或者可能我只是無法想象作者可以通過這個意思。從Bezier貼片的控制點生成多邊形網格

B. Use blending tables to calculate points in "row curve": 

for(u = 0; u < 10; u++) 
{ 
    blend row 0 control points -> new control point 
    blend row 1 control points -> new control point 
    blend row 2 control points -> new control point 
    blend row 3 control points -> new control point 

    for(v = 0; v < 10; v++) 
    { 
     blend 4 new control points -> point on surface 
    } 
} 
C. Generate edges and polygons from grid of surface points. 

任何人都可以解釋我的意思嗎?謝謝。

回答

1

貝塞爾曲面是貝塞爾曲線,其中控制點沿着其他貝塞爾曲線移動,而不是靜止。

B(0,u) = (1-u)^3 
B(1,u) = 3*u*(1-u)^2 
B(2,u) = 3*u^2*(1-u) 
B(3,u) = u^3 

C[0..3, 0..3] = control points 

Curve(t,C0,C1,C2,C3) = B(0,t)*C0 + B(1,t)*C1 + B(2,t)*C2 + B(3,t)*C3 

Surface(s,t,C[0..3,0..3]) = 
    Curve(t, Curve(s, C[0,0], C[1,0], C[2,0], C[3,0]), 
      Curve(s, C[0,1], C[1,1], C[2,1], C[3,1]), 
      Curve(s, C[0,2], C[1,2], C[2,2], C[3,2]), 
      Curve(s, C[0,3], C[1,3], C[2,3], C[3,3])) 

這些功能樣品的t(和s)的特定值的曲線(或表面)。

本文討論在計算總和之前緩存Bernstain多項式的值(B(i,u)函數)。這樣你就不必每次重新計算它。

然後繼續談論細分。這涉及將每條曲線中的四個控制點分成兩組,每組四個。每組將跟蹤原曲線的一半。

將其推進到曲面中,可以將每條曲線分成兩部分,然後將每條曲線分成兩部分。這會給你四個表面追蹤原曲線的一部分。

細分通常比採樣曲線/表面快。

SplitCurve(C0,C1,C2,C3) = [ 
    C0,       # First control-point of first sub-curve 
    (C0 + C1)/2,     # Second control-point of first sub-curve 
    (C0 + 2*C1 + C2)/4,   # Third control-point of first sub-curve 
    (C0 + 3*C1 + 3*C2 + C3)/8, # Shared first/last control-point 
    (C1 + 2*C2 + C3)/4,   # Second control-point of second sub-curve 
    (C2 + C3)/2,     # Third control-point of second sub-curve 
    C3       # Fourth control-point of second sub-curve 
] 

SplitSurface(C[0..3,0..3]) = 
    col0 = SplitCurve(C[0,0], C[0,1], C[0,2], C[0,3]) 
    col1 = SplitCurve(C[0,0], C[0,1], C[0,2], C[0,3]) 
    col2 = SplitCurve(C[0,0], C[0,1], C[0,2], C[0,3]) 
    col3 = SplitCurve(C[0,0], C[0,1], C[0,2], C[0,3]) 
    return [ 
     SplitCurve(col0[0], col1[0], col2[0], col3[0]), 
     SplitCurve(col0[1], col1[1], col2[1], col3[1]), 
     SplitCurve(col0[2], col1[2], col2[2], col3[2]), 
     SplitCurve(col0[3], col1[3], col2[3], col3[3]), 
     SplitCurve(col0[4], col1[4], col2[4], col3[4]), 
     SplitCurve(col0[5], col1[5], col2[5], col3[5]), 
     SplitCurve(col0[6], col1[6], col2[6], col3[6]) 
    ] 

繼續細分每個子表面,直到所有控制點位於同一像素內。這裏「像素」是指投影曲線。要檢查這一點,天真的方法是將每個控制點投影到屏幕座標。

要創建三角形網格,可以將控制點細分一些固定的次數,然後選取每個曲面的左上角控制點。