При реализации алгоритма Blinn/Loop при рендеринге кривой, я понимаю, что существует особый случай для Loop Curve Type. Как описано в их статье (подраздел 4.4, стр. 6-7), они сказали, что кривая должна быть разделена на две, но я действительно смущен как получить точку пересечения.
Здесь мой результат рендеринга:
Как указано в статье, этот артефакт возникает, когда либо td/sd
, либо te/se
находятся между значением [0, 1].
Мой исходный код:
...
case CURVE_TYPE_LOOP:
td = d2 + sqrt(4.0 * d1 * d3 - 3.0 * d2 *d2);
sd = 2.0 * d1;
te = d2 - sqrt(4.0 * d1 * d3 - 3.0 * d2 * d2);
se = 2.0 * d1;
if((td / sd > 0.0 && td/ sd < 1.0) || (te / se > 0.0 && te/ se < 1.0))
std::cout << "error\n";
// F matrix will be multiplied with inverse M3 to obtain tex coords (I use Eigen library btw...)
F << td * te, td * td * te, td * te * te, 1,
(-se * td) - (se * te), (-se * td * td) - (2.0 * sd * te * td), (-sd * te * te) - (2.0 * se * td * te), 0,
sd * se, te * sd * sd + 2.0 * se * td* sd, td * se * se + 2 * sd * te * se, 0,
0, -sd * sd * se, -sd * se * se, 0;
break;
...