Graphics 从Bezier面片的控制点生成多边形网格
我想在Bézier曲面上制作程序,我在互联网上发现,有一种方法可以做到,但我不太清楚第二步和第三步。或者我只是无法想象作者所说的是什么意思Graphics 从Bezier面片的控制点生成多边形网格,graphics,bezier,Graphics,Bezier,我想在Bézier曲面上制作程序,我在互联网上发现,有一种方法可以做到,但我不太清楚第二步和第三步。或者我只是无法想象作者所说的是什么意思 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 -&g
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.
B.使用混合表计算“行曲线”中的点:
对于(u=0;u<10;u++)
{
混合行0控制点->新控制点
混合第1行控制点->新控制点
混合第2行控制点->新控制点
混合第3行控制点->新控制点
对于(v=0;v<10;v++)
{
混合4个新控制点->曲面上的点
}
}
C.从曲面点网格生成边和多边形。
有人能解释一下我的意思吗?Thx.贝塞尔曲面是贝塞尔曲线,其中控制点沿其他贝塞尔曲线移动,而不是静止
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])
]
继续细分每个子曲面,直到所有控制点位于同一像素内。这里“像素”指的是投影曲线。要检查这一点,最简单的方法是将每个控制点投影到屏幕坐标
要创建三角形网格,可以将控制点细分固定次数,然后拾取每个曲面的左上角控制点。贝塞尔曲面是贝塞尔曲线,其中控制点沿其他贝塞尔曲线移动,而不是静止
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])
]
继续细分每个子曲面,直到所有控制点位于同一像素内。这里“像素”指的是投影曲线。要检查这一点,最简单的方法是将每个控制点投影到屏幕坐标
若要创建三角形网格,可以将控制点细分固定次数,然后拾取每个曲面的左上角控制点