分割有理贝塞尔曲线

根据某人的说法,可以通过将其控制点从 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]);
}
马特·蒂默曼斯

例如,在 2 阶中,贝塞尔曲线为 f(t) = (1-t) 2 P 0 + 2t(1-t)P 1 + t 2 P 2

有理贝塞尔曲线是 (1-t) 2 P 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 2 w 2

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

当你两者都做时,它会简化,你的新观点是:

P 0 ' = w 0 (P 0 ,1)

P 1 ' = w 1 (P 1 ,1)

P 2 ' = w 2 (P 2 ,1)

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

f(t) = (1-t) 2 P 0 ' + 2t(1-t)P 1 ' + t 2 P 2 '

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章