Самоучитель по 3dsmax 7

         

Найдем теперь du и ddu


Найдем теперь du и ddu. Для текущей точки x имеем:

du(x) = u(x+1) - u(x),
du = (A*(x+1)*(x+1)+B*(x+1)+C) - (A*x*x+B*x+C) = A*(2*x+1) + B,

ddu(x) = du(x+1) - du(x),
ddu = (A*(2*(x+1)+1)+B) - (A*(2*x+1)+B) = 2*A.

Т.о., начальные значения u, du, ddu будут равны

u = C,
du = A + B,
ddu = 2*A.

А по известным начальным значениям u, du, ddu последовательно вычисляем значения u в любой точке:

u(0), du(0), ddu - известны
u(1) = u(0) + du(0), du(1) = du(0) + ddu
u(2) = u(1) + du(1), du(2) = du(1) + ddu
u(3) = u(2) + du(2), du(3) = du(2) + ddu
...

Для v все делается полностью аналогично.

Таким образом, рисование строки будет выглядеть примерно так: // ... // считаем u, v для начала, середины и конца строки ua = uz_start / z1_start; va = vz_start / z1_start; ub = (uz_start + uz_end) / (z1_start + z1_end); vb = (vz_start + vz_end) / (z1_start + z1_end); uc = uz_end / z1_end; vc = vz_end / z1_end; // считаем начальное du и ddu pa = 2 * ((uc - ua) - 2 * (ub - ua)) / (length * length); pb = (4 * (ub - ua) - (uc - ua)) / length; pc = ua; u = pc; du = pa + pb; ddu = 2 * pa; // считаем начальное dv и ddv pa = 2 * ((vc - va) - 2 * (vb - va)) / (length * length); pb = (4 * (vb - va) - (vc - va)) / length; pc = v_a; v = pc; dv = pa + pb; ddv = 2 * pa; // рисуем кусок while (length--) { putpixel(current_sx, current_sy, texture[v][u]); u += du; v += dv; du += ddu; dv += ddv; } // ...

По сравнению с перспективно-корректным текстурированием имеем более медленный внутренний цикл, но меньшее для длинных строк количество делений.



Содержание раздела