Това е грейд, да, обаче е ограничен при използване(при използване на \t таг). Повече е пригоден за тайпсет, но както и да е.
Цялата работа става чрез \clip тага. От уроците знаеш как се разполагат аргументите в \clip. Още не съм обяснил за променливите(има ги в твоя пример), но ще се опитам все пак да обясня какво точно става.
Съсредоточаваме се само върху \clip и по-точно _g.interpolate.
G.interpolate е lua reference и дели дадена стойност на части. Тази стойност обикновено е числова и е
прогресивна. Тоест стойността НЕ се дава като определена константа(цифрата 5 например), а е растяща или намаляваща функция(за поведението на дадена функция се учи в часовете по математика). Като синтаксис се записва по следния начин: _G.interpolate(функция на делене, променлива1, променлива2). Функцията на делене може да е всякаква, стига тя да е растяща или намаляваща. Променлива1 и 2 дават началните ѝ стойности или иначе казано интервалът на изменяне на стойностите, които ще бъдат генерирани впоследствие. От математическа гледна точка това са интервалите, в които се изменя функцията(примерът не е много подходящ, но го използвам, за да си направите асоциация за по-лесно разбиране). Ще разгледам един пример, за да онагледя нещата визуално.
Нека делим дадена стойност в интервала 30;80 при растяща функция със стойности от 1 до 5. Какво става тогава? От 30 до 80 са 50 единици. Тези 50 единици се делят на 5 части, всяка по 10. В първата част разделената стойност е 30+10=40, във втората 30+20=50 и т.н. до 80. Тоест ще се генерират стойности в реда:
40;
50;
60;
70;
80;
Ако беше заденено от 1 до 8, тогава 50 щеше да се раздели на 6, което е 6,25. Тогава генерираните стойности щяха да бъдат:
36,25;
42,50;
48,75;
54,00;
60,25;
66,50;
71,75;
80,00;
Това е интерполирането като понятие. Нека се върна на примера, който си дал.
Делящите функции в случая са растящи j/maxj и (j-1)/maxj. В караоке темплейтъра, както казах в уроците, loop модифайърът се контролира от j променливата. Когато е зададен някакъв loop и j присъства в караоке скрипта, той се изменя при всеки цикъл и повишава стойността си(като ВИНАГИ започва от 1). По-просто казано j отбелязва стойната на самия цикъл от общия брой цикли. Нека е зададен template loop 5, тогава j ще се изменя в реда 1,2,3,4,5. Maxj от своя страна е максималната стойност, която j може да приеме. В случая това е 5. Тоест декларирайки loop 5 и j/maxj, ние ограничаваме изменението на j в интервала 1;5 точно както в горния случай( виждате, че нещата са подобни). Тоест горният пример, описан като скрипт, би изглеждал така:
template syl loop 5 и вътре !_g.interpolate(j/maxj,30,80)!. Във втория случай би изглеждал така: template syl loop 8 и вътре !_g.interpolate(j/maxj,30,80)!
Отново се връщаме на примера $top и $bottom(тези променливи ще ги обясня в следващия урок, ах, защо нямам време...). Това са променливи, които сочат позицията на шрифта от ъгъла на картината до горния връх(top) или до долния връх(bottom) на шрифта/обекта(т.е. само по ординатната ос y). Тоест те ще зависят от големината на шрифта/обекта и винаги ще се променят. Да приемем, че горният връх на шрифта се намира на позиция 100, а долният - на 150. Тогава интервалът на изменение на функцията е 100;150, т.е. 50 пиксела(вече не ползвам единици, защото имаме конкретно определена такава). Тъй като е в \clip, това означава, че шрифтът ще бъде резнат на части(знаете приложението на \clip). На колко части обаче зависи от стойността на използвания loop. А колкото е по-голям loop, толкова ще бъде по прецизно изрязването на шрифта. Защото едно е да е разделен на 5 части, всяка от които по 10 пиксела(50:5), а съвсем друго на 50 части, всяка от които по 1 пиксел(50:50). Ето какво прави \clip($lleft,!_G.interpolate((j-1)/maxj, $ltop,$lbottom)!,$lright,!_G.interpolate(j/maxj, $ltop,$lbottom)!) - дели шрифтът на части. Тука виждате, че е използвано (j-1)/maxj. Това означава, че при loop 5 ще имаме стойности:
1 -1=0;
2 -1=1;
3 -1=2;
4 -1=3;
5 -1=4; Дотук, защото loop е 5, т.е. j ще е максимално 5 и нито стойност повече. Не следете резултата, а изменението на j - това е много важно.
Защо обаче е използван (j-1)? За да се получи точно изрязване на шрифта от неговия горен до неговия долен ъгъл. Връщаме се на интервала 100;150, при j-1 ще имаме измемение на функцията в реда:
100+(1-1)*10=100;
100+(2-1)*10=110;
120;
130;
140;
Това е самото изрязване на части на шрифта. (вижте на снимката как точно се получава:
![Изображение](http://store.picbg.net/thumb/02/B5/60acc7e23adb02b5.png)
Тука искам да добавя нещо. Позиционните променливи не могат да дадат толкова точни стойности на върховете/ръбовете на шрифта(представете си буквата g, има опашка). Просто това е едно от ограниченията в караоке темплейтъра, целият шрифт се взема общо, а не всеки символ поотделно. Тоест върхът на една буква може да не е връх на друга.
Сега ще питате, ама защо само по ординатата се дели, нали в \clip се дават и по абсцисната ос стойности? Ами такъв е примерът - имаме \cip($lleft...), което дава начална точка на изрязването левия ръб на репликата по абсцисата и $lright - като дясна крайна точка по абсцисата. И тъй като, както казах, тези ръбове не се определят точно, ще променя примера, даден от Аникин, за да не се получават недоизрязвания и за да може шрифтът да се вижда изцяло(а не с липсващи по 1-5 пиксела). \clip трябва да изглежда така \clip(
0,!_G.interpolate((j-1)/maxj, $ltop,$lbottom)!,
!meta.res_x!,!_G.interpolate(j/maxj, $ltop,$lbottom)!). Тоест вместо за начална точка да е даден ръбът на шрифта, пиша 0 и начална точка става левият ръб на видео рамката. Крайна дясна точка пък е meta.res_x, което е десният ръб на видео рамката(независимо от резолюцията).
Приключих с изрязването на шрифта и пристъпвам към самия грейд и промяната на цвета.
Към _g.interpolate, добавяйки _g.interpolate_color вече се работи не с числови, а с цветови стойности. Синтаксисът остава същият, но вместо променливи се пишат цветове и се ограждат с кавички(като се обозначава на кой цвят ще бъде извършена интерполацията - 1c, 2c, 3c, 4c и след тях се поставят ! ! за означение на code block, който ще разгледам в уроците, живот и здраве). Обяснението на интерполацията остава същото. Интервалът на изменение са 2 цвята, които служат за начални и крайни стойности на функцията. Самият преход от единия цвят до другия се осъществява от делящата функция j/maxj. Ако началният цвят е бял, а крайният - черен, при втория и всеки последвал цикъл(loop) цветът ще става все по-тъмен, докато не стане черен. И тъй като шрифтът вече е изрязан(вижте снимката) изрязаните части ще приемат различни цветове, чрез което получаваме грейдиент. И отново - колкото е по-голям loop-ът, толкова ше бъде по-прецизен грейдът.
Окончателно скриптът би изглеждал по следния начин:
![Изображение](http://store.picbg.net/thumb/EB/7E/dc7a7b765cc6eb7e.png)
Питайте, ако имате въпроси.
ПП:
В clip-a единият аргумент има растяща j-1 фукнция, за да може крайната стойност по ординатата(която е само j), да се пада начало на следващото изрязване и да не се получават резки(празни разстояния) между изрязаните части.
ПП2:
Ето защо не ми се обясняват lua reference. Много време отнема и обясненията са суперабстрактни за обикновения човек, който не се занимава усилено с математика, математически анализ и представяне на данни под формата на математически записи.