1

我想在贝塞尔曲面上制作程序,我在网上找到了这篇文章,有一种方法可以做到,但我不明白第二步,特别是第三步。或者我可能只是无法想象作者的意思。

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.

谁能解释我的意思?谢谢。

4

1 回答 1

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

本文讨论了B(i,u)在计算总和之前缓存 Bernstain 多项式(函数)的值。这样您就不必每次都重新计算它。

然后它继续谈论细分。这涉及将每条曲线中的四个控制点分成两组,每组四个。每组将追踪原始曲线的一半。

将其推进到曲面中,将每条行曲线分成两条,然后将每条列曲线分成两条。这将为您提供四个曲面跟踪原始曲线的一部分。

细分通常比对曲线/曲面进行采样要快。

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])
    ]

继续细分每个子表面,直到所有控制点都位于同一像素内。这里的“像素”是指投影曲线。要检查这一点,最简单的方法是将每个控制点投影到屏幕坐标。

要创建三角形网格,您可以将控制点细分一些固定次数,然后选择每个曲面的左上角控制点。

于 2012-06-24T17:25:49.150 回答