拆分有理贝塞尔

Splitting rational bezier

提问人:Illari 提问时间:6/14/2022 更新时间:6/14/2022 访问量:104

问:

根据某人的说法,可以通过将其控制点从 2d 投影到 3d(或从 3d 到 4d 等)来拆分有理贝塞尔,用 De Casteljau 拆分得到的非有理曲线,然后将两条曲线投影回 2d,使它们再次有理。

我有一个 Shadertoy 原型,我试图将权重直接放在 z 值的位置,然后意识到需要对 xy 坐标进行某种变换,以便 De Casteljau 计算的中点 (m) 与加权曲线对齐。投影矩阵可以具有我所看到的视场和纵横比属性。

我需要什么样的矩阵才能使点和权重正确对齐,我应该如何处理权重才能将它们转换为 z 坐标?

vec3[6] split(float[3] r, vec2[3] p, float t)
{
    vec3 a = vec3(p[0],r[0]);
    vec3 b = vec3(p[1],r[1]);
    vec3 c = vec3(p[2],r[2]);
    vec3 ab = mix(a, b, t);
    vec3 bc = mix(b, c, t);
    vec3 m = mix(ab, bc, t);
    
    vec3[3] l = vec3[3](a,ab,m);
    vec3[3] R = vec3[3](m,bc,c);
    return vec3[6](l[0],l[1],l[2],R[0],R[1],R[2]);
}
数学 图形 语言无关的 贝塞尔

评论

0赞 Makogan 6/14/2022
你有解释的来源吗?我正在尝试理解您的问题描述。

答:

1赞 Matt Timmermans 6/14/2022 #1

例如,在 2 度中,贝塞尔是 f(t) = (1-t)2 P0 + 2t(1-t)P1 + t 2 P 2

有理贝塞尔是 (1-t)2P 0 w 0 + 2t(1-t)P 1 w 1 + t 2 P 2 w 2 / (1-t)2 w 0 + 2t(1-t)w 1 + t 2w 2

如果透视将映射 (x,y,z) 转换为 (x/z, y/z),则可以将权重直接移动到 z 坐标中以获得正确的分母,但还必须将相应的点相乘以使新点映射到相同的 (x,y)。

当你同时做这两项时,它会简化,你的新点是:

P 0' = w 0(P 0,1

P 1' = w 1(P1,1

P 2' = w 2(P 2,1

然后,常规 3D 贝塞尔将在透视变换下映射到相同的 (x,y) 曲线:

f(t) = (1-t)2 P0' + 2t(1-t)P1' + t 2 P 2'