http://research.microsoft.com/en-us/um/people/cloop/vmvbpc.pdf このホワイト ペーパーでは、著者は、クリップ スペースでベジエ パッチを背面カリングする新しい方法を示しています。セクション 5 では、数式を展開するためのシンボリック代数ソフトウェアを使用して、行列 T(u,v) のすべての係数が cross4 の和であることを発見しました。彼らはテーブルを生成しました:
int idx[4][] = {{i1, j1, k1, l1},
...
{im, jm, km, lm}};
float wgt[] = {w1, ..., wm};
だから私は同じものを作ろうとしていますが、記号代数ソフトウェアを使用したことはありません. 私が4時間後に作ったのはこれだけです(Wolfram Mathematica):
B[u_, v_] := Transpose[({
{BernsteinBasis[3, 0, u]},
{BernsteinBasis[3, 1, u]},
{BernsteinBasis[3, 2, u]},
{BernsteinBasis[3, 3, u]}
})].({
{b0, b1, b2, b3},
{b4, b5, b6, b7},
{b8, b9, b10, b11},
{b12, b13, b14, b15}
}).({
{BernsteinBasis[3, 0, v]},
{BernsteinBasis[3, 1, v]},
{BernsteinBasis[3, 2, v]},
{BernsteinBasis[3, 3, v]}
})
fx[a_, b_, c_] := Det[({
{a.y, b.y, c.y},
{a.z, b.z, c.z},
{a.w, b.w, c.w}
})]
fy[a_, b_, c_] := -Det[({
{a.x, b.x, c.x},
{a.z, b.z, c.z},
{a.w, b.w, c.w}
})]
fz[a_, b_, c_] := Det[({
{a.x, b.x, c.x},
{a.y, b.y, c.y},
{a.w, b.w, c.w}
})]
fw[a_, b_, c_] := -Det[({
{a.x, b.x, c.x},
{a.y, b.y, c.y},
{a.x, b.z, c.z}
})]
cross4[a_, b_, c_] := Transpose[({
{fx[a, b, c], fy[a, b, c], fz[a, b, c], fw[a, b, c]}
})]
T[a_, b_] :=
cross4[B[a, b], D[B[u, v], u] /. u -> a /. v -> b,
D[B[u, v], v] /. u -> a /. v -> b]
記号代数が得意な人が、この表を生成するのを手伝ってくれませんか?