根據某人的說法,可以通過將其控制點從 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]);
}
uj5u.com熱心網友回復:
例如,在 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 '
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/491184.html
