TCAX 字幕特效制作工具官方论坛 | ASS | TCAS | Python | Aegisub | Lua

 找回密码
 新人加入
查看: 3322|回复: 4
打印 上一主题 下一主题

aegisub自编特效基础教程 [复制链接]

Rank: 4

跳转到指定楼层
楼主
发表于 2018-4-19 16:21:16 |只看该作者 |倒序浏览
本帖最后由 CMD 于 2018-5-17 10:35 编辑

1.今天讨论一下关于aegisub中的自动化,这篇帖子适合新手们参考,但需要新手对ASS特效标签有一些了解,懂得如何去

使用,以及auto中提供的内联变量,如果不懂可以参考这两位dalao的帖子,这篇帖子能教会新手一步一步的编写自己第

一个特效脚本,主要教会新手如何设置时间和编写出类似于tcax中的基础特效

Template修饰语

Template内置变量

效果预览

用到的ass文件: 特效5-第一个完整特效.rar (37.13 KB, 下载次数: 852)

本帖PDF: temp自编特效基础.rar (989.85 KB, 下载次数: 846)

2.打开aegisub,在字幕时间控制面板,输入template syl noblank,表示按照音节来分割,忽略空行,syl也可以换

成char,对每个字产生作用,不一定是音节

图1.png

图2.png
  1. template syl noblank        !retime("abs",$lstart+syl.i*40-440,$lstart+syl.i*40-40)!
复制代码
3.输入后就可以在当前字幕行输入特效标签代码,类似于下面

图3.png



4.输入好特效代码后点击自动化,应用到卡拉OK模板

图4.png


5.pos为位置坐标,里面的$x,$y,为音节或者默认坐标,也可以使用$scenter,$smiddle,音节的默认坐标,生成

后的效果,由于没有对时间的设定,只能看到,一行字幕一闪而过

图5.png


6.我们讨论的重点是关于retime()时间的设定,先借用dalao们的两张图片,方便新人理解,下面是retime()函数

图6.png


7.提供的模式


图7.png



8.模拟tcax时间设置,我们输入retime("模式",调整时间a,调整时间b)单位毫秒,如果使用到计算,需要用!!括起来,

不然aegisub会当成普通文字处理,不会进行数值运算,输入的内联变量会高亮显示

图8.png
  1. !retime("abs",$lstart+syl.i*40-40,$lend-($syln-syl.i-1)*40+40)!
复制代码
9.模拟的时间

图9.png
  1. 入场

  2. template syl noblank        !retime("abs",$lstart+syl.i*40-440,$lstart+syl.i*40-40)!

  3. tcax时间:
  4.            开始时间:_start + _j * _FD / 10 -  _FD / 10 - duration / 10          $lstart+syl.i*1000/25-1000/25-1000/25*10/10

  5.            结束时间:_start + _j * _FD / 10 - _FD / 10          $lstart+syl.i*1000/25-1000/25

  6. 存在

  7. template syl noblank        !retime("abs",$lstart+syl.i*40-40,$lend-($syln-syl.i-1)*40+40)!

  8. tcax时间:
  9.            开始时间:_start + _j * _FD / 10 - _FD / 10          $lstart+syl.i*1000/25-1000/25
  10.        
  11.            结束时间:_end - (_n - _j - 1) * _FD / 10 + _FD / 10          $lend-($syln-syl.i-1)*1000/25+1000/25


  12. 表现

  13. template syl noblank        !retime("start2syl",0,0)!

  14. tcax时间:
  15.             开始时间:_start + _elapk          $sdur K值的持续时间

  16.             结束时间:_start + _elapk + _k          $sdur K值的持续时间

  17. 退场

  18. template syl noblank        !retime("abs",$lend-($syln-syl.i-1)*40+40,$lend-($syln-syl.i-1)*40+440)!

  19. tcax时间:
  20.             开始时间:_end - (_n - _j - 1) * _FD / 10 + _FD / 10           $lend-($syln-syl.i-1)*1000/25+1000/25

  21.             结束时间:_end - (_n - _j - 1) * _FD / 10 + _FD / 10 + _FD           $lend-($syln-syl.i-1)*1000/25+1000/25*10/10
复制代码
10.详细的解释一下上面图片的参数,时间使用的tcax的时间,新人需要知道tcax里面的时间单位为10ms,aegisub
中的时间单位为1ms



11.例如计算每一帧的持续时间,tcax中:_FD = 1000 / GetVal(val_FXFPS),tcax里面tcc文件使用的视频帧率为23.9

75
,为了方便个人使用的是25/s,计算的结果等于40ms每一帧,由于aegisub中单位为1ms,我们要字幕出现为每一

帧出现一个,时间就应该为40ms,但tcax的时间单位为10ms,在aegisub里面就会变成400ms,所以文字的入场时间就

需要_FD/10


12.除了表现效果中模式使用syl,其它效果retime()函数中使用的模式为abs,从时轴上获取时间,表现效果的模式后面

再讲解,所以retime("abs",时轴行的开始时间,时轴行的结束时间),我们直接套用tcax入场脚本的时间,个人为了方便

使用帧率为25/s,便于计算


13.retime()中的$lstart行的开始时间$lend行的结束时间,音节的开始时间$sstart,结束时间$send,和行的时间变

量一样,只不过首字母不一样



14. syl.i为音节计数器,处理第1个音节就为数值为1,第2个音节数值为2,以此类推,使用音节变量需要在变量前面加上

$符号,syln和si,一个是行的音节总数,另一个是这一行k的数目,应用卡拉OK模板后,所有出现变量的地方都会被替换

成获取到的数值,像样式里面的位置,颜色,透明度



15.设置完时间后就可以添加ASS特效标签代码

图10.png
  1. 入场

  2. template syl noblank        !retime("abs",$lstart+syl.i*40-440,$lstart+syl.i*40-40)!{\move($center,!$middle-25!,$center,$middle,0,400)\1cFFFFFF\bord0}

  3. tcax时间:
  4.            开始时间:_start + _j * _FD / 10 -  _FD / 10 - duration / 10          $lstart+syl.i*1000/25-1000/25-1000/25*10/10

  5.            结束时间:_start + _j * _FD / 10 - _FD / 10          $lstart+syl.i*1000/25-1000/25

  6. 存在

  7. template syl noblank        !retime("abs",$lstart+syl.i*40-40,$lend-($syln-syl.i-1)*40+40)!{\pos($scenter,$middle)\1cFFFFFF\bord0}

  8. tcax时间:
  9.            开始时间:_start + _j * _FD / 10 - _FD / 10          $lstart+syl.i*1000/25-1000/25
  10.        
  11.            结束时间:_end - (_n - _j - 1) * _FD / 10 + _FD / 10          $lend-($syln-syl.i-1)*1000/25+1000/25


  12. 表现

  13. template syl noblank        !retime("start2syl",0,0)!{\t(0,$sdur,\frz-30\fscx155\fscy155)\pos($scenter,$middle)\3c!_G.ass_color(_G.HSV_to_RGB($si/$syln*390,0.9,0.8))!

  14. \bord2\blur2\t(0,$sdur,\frz0\fscx100\fscy100)}

  15. tcax时间:
  16.             开始时间:_start + _elapk          $sdur K值的持续时间

  17.             结束时间:_start + _elapk + _k          $sdur K值的持续时间

  18. 退场

  19. template syl noblank        !retime("abs",$lend-($syln-syl.i-1)*40+40,$lend-($syln-syl.i-1)*40+440)!{\move($scenter,$middle,$scenter,!$middle+25!,0,400)\1cFFFFFF\bord0}

  20. tcax时间:
  21.             开始时间:_end - (_n - _j - 1) * _FD / 10 + _FD / 10           $lend-($syln-syl.i-1)*1000/25+1000/25

  22.             结束时间:_end - (_n - _j - 1) * _FD / 10 + _FD / 10 + _FD           $lend-($syln-syl.i-1)*1000/25+1000/25*10/10
复制代码
16.应用后的效果

图11.png
  1. !retime("start2syl",0,0)!{\t(0,$sdur,\frz-30\fscx155\fscy155)\pos($scenter,$middle)\3c!_G.ass_color(_G.HSV_to_RGB($si/$syln*390,0.9,0.8))!\bord2\blur2\t(0,$sdur,\frz0\fscx100\fscy100)}
复制代码
17.主要讲解一下关于!_G.ass_color(_G.HSV_to_RGB($si/$syln*390,0.9,0.8))!渐变,这两个_G.系列,一个作用是设定

颜色,一个作用是HSV转成RGB格式,也就是转成&H00FF00& 这种,数值1 是色调,也就是【红橙黄绿青蓝紫】数值

2 是饱和度,也就是 这个颜色的【浓度】数值3 是亮度一般来讲 饱和度、亮度用1(满),可以使用小数



18.色调用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它

们的补色是:黄色为60°,青色为180°,品红为300°


19.例如,一句歌里面,有10个音节,那么每一个音节的色调就是 1/10 *400 = 40,2/10 *400 = 80,3/10 *400 =

120,4/10 *400 = 160,每个音节就会平分色调,就达到渐变色的效果了


图12.png



20.也可以!_G.ass_color(math.random(50,255),math.random(50,255),math.random(50, 255))!,下面是效果,颜色

偏淡,这个比较适用于整行文字,更换颜色效果,math.random()函数可以根据传入的数字从中随机生成一个随机数


图13.png


21.是时候讨论附加表现效果的时间问题了,我们把in和main和out样式设置为白色,无边框,表现效果设置为渐变
  1. 入场:!retime("abs",$lstart+syl.i*40-440,$lstart+syl.i*40-40)!{\move($center,!$middle-25!,$center,$middle,0,400)\1cFFFFFF\bord0}
复制代码
  1. 退场:!retime("abs",$lend-($syln-syl.i-1)*40+40,$lend-($syln-syl.i-1)*40+440)!{\move($scenter,$middle,$scenter,!$middle+25!,0,400)\1cFFFFFF\bord0}
复制代码
图14.png


22.表现效果和附加效果可以理解为是同一种效果,下面为retime函数使用syl模式的表现效果
  1. 附加和表现:!retime("syl",0,0)!{\t(0,$sdur,\frz-30\fscx155\fscy155)\pos($scenter,$middle)\3c!_G.ass_color(_G.HSV_to_RGB($si/$syln*390,0.9,0.8))!\bord2\blur2\t(0,$sdur,\frz0\fscx100\fscy100)}
复制代码
图15.png


23.syl模式开始时间为当前音节的开始时间,结束时间为音节的结束时间,相当于retime("syl",音节开始时间,音节结束

时间),里面的开始和结束时间可以写成0,意思是获取默认时间值,不修改,持续时间为$sdur,当前音节的持续时间

,在这个时间内可以对音节添加各种效果,类似放大,缩小,旋转


图16.png


24.第2种,表现效果开始时间为音节(词)的开始时间,图片中的文字逐个渐变,持续时间一直到当前行的结束时间

图17.png



25.前面的表现效果retime()函数使用的模式为syl2end,表示每个词(音节)的开始时间为词K的结束时间,结束时间为

行的结束时间,相当于retime("syl2end",$send,$lend),里面默认获取到的数值为,k的结束时间,和行的结束时间,

我们需要的是当前音节的开始时间,所以retime函数修改为retime("syl2end",-$sdur,0),所以$sstart=$send-$sdur
  1. 附加和表现:!retime("syl2end",-$sdur,0)!{\pos($center,$middle)\t(0,$sdur,\fscx135\fscy135\frz90)\3c!_G.ass_color(_G.HSV_to_RGB($si/$syln*390,0.7,0.9))!\bord2\blur3\t(0,$sdur,\fscx100\fscy100\frz0)}
复制代码
图18.png



26.第3种,使用start2syl模式,使用后为所有音节的开始时间为行的开始时间结束时间为音节的开时间,相当于

retime("start2syl",行的开始时间,音节开始时间),使用的话修改为retime("start2syl",0,0),表现效果为渐变颜色逐个

文字消失,直到最后一个音节的结束,适和用在粒子特效表现时间
  1. 附加和表现:!retime("start2syl",0,0)!{\pos($center,$middle)\fs37\bord3\blur3\3c!_G.ass_color(_G.HSV_to_RGB($si/$syln*390,0.9,0.8))!}
复制代码
图19.png


27.讲解了这么多,相信新手们基本可以用temp来模拟tcax的基本效果,下面我们通过观察特效表现效果间接编写

脚本,我们试着不用tcax的时间公式,来编写第一个脚本,个人修改的模板

图20.png


28.新手在使用其它的特效模板的时候,需要观察的是特效的入场存在表现退场这四个效果,注意它们的各个

效果的开始时间,和结束时间,可以记在记事本上,然后在考虑用哪种时间方式来实现里面的效果,tcax还是temp

的时间方式


29.我们一个一个效果来实现,并讲解里面关于时间的问题,入场效果使用模式为start2syl,每个词的开始时间为行

的开始时间,结束时间为音节K的开始时间
  1. 入场:!retime("start2syl",-500+syl.i*40,0)!{\fry90\move($center,!$middle-25!,$center,$middle,0,400)\1cFFFFFF\bord0\t(0,400,\fry0)}
复制代码
图21.png


30.我们设置的为-500+syl.i*40 , syl.i为计数器,第一个词的的开始时间提前为-500+1*40=-460,第一个音节的出现时

间在行的开始时间的基础上提前460ms,第二个词的开始时间为-500+2*40=-420,提前了420ms,比第一个词延迟

40ms
,以此类推,后面每处理一个音节(词),的开始时间都会比前一个音节的开始时间延迟40ms,这种时间差可以实

现逐个文字下降的效果,类似tcax里面的in_003,和in_008
  1. 存在:!retime("abs",$lstart+syl.i*40-40,$lend-($syln-syl.i-1)*40+40)!{\pos($scenter,$middle)\1cFFFFFF\bord0}
复制代码
图22.png



31.main方式持续时间的问题,打开前面我们写好的tcax模板,应用效果后可以发现,表现效果,和存在方式,有些

冲突,白色为main,红色为eft,通过对比前面第27的效果图,main方式的开始时间为行的开始时间,结束时间为

节(词)的开始时间
,eft效果的开始时间为,音节的开始时间,结束时间为行的结束时间,入场和存在效果是写在一起


图23.png


32.通过上面的分析可以知道retime()函数使用的模式,in和main使用start2syl,eft使用syl2end,out使用postline,最终

编写的代码为
  1. 入场和存在:!retime("start2syl",syl.i*50-500,0)!{\fry-90\moves4($scenter,!$smiddle+100!,$scenter,!$smiddle-100!,$scenter,!$smiddle+100!,$scenter,$smiddle,0,1000)\t(0,400,\fry0)\alpha&HBF&\1vc(00FFFF,FF0000,9900FF,9900FF)}
复制代码
  1. 表现或附加:!retime("syl2end",-$sdur,-200)!{\pos($center,$middle)\t(0,$sdur,\fscx135\fscy135\frz90)\3c!_G.ass_color(_G.HSV_to_RGB($si/$syln*390,0.7,0.9))!\bord2\blur3\t(0,$sdur,\fscx100\fscy100\frz0)}
复制代码
  1. 退场:!retime("postline",syl.i*50-500,syl.i*50+500)!{\fry0\move($center,$middle,$center,!$middle-35!,0,400)\t(0,400,\fry90)\fs37\bord3\blur3\3c!_G.ass_color(_G.HSV_to_RGB($si/$syln*390,0.9,0.8))!}
复制代码
图24.png

33.入场和存在: start2syl模式中词的开始时间设置为syl.i*50-500,这个大家可以自行调整,结束时间为每个音节(词)的
开始时间,不需要修改,



34.表现效果使用的模式为syl2end,由于前面的main方式的结束时间为音节的开始时间,所以后面的eft效果的开始时

间为-$sdur(当前音节的持续时间),通过$sstart=$send-$sdur计算得出音节的开始时间,后面的结束时间行的结束时

间,为-200,提前200ms结束,这样是为了给后面的退场效果保留一些时间,如果为0,表现效果不能及时的消失,

造成短暂的停留,会影响后面的字幕的入场效果

图25.png



35.退场效果使用的模式为postline,每一行的开始时间为当前行的结束时间,结束时间为该行的结束时间加上调整时

间a,和调整时间b,a设置的和入场时间一样,后面b的调整时间为syl.i*50+500,和前面第30一样,造成一个时间差

,逐个文字延迟消失,入场和退场的效果和tcax的相似,也是每一帧进入一个文字,退出也每一帧消失一个文字


图26.png


36.moves3或moves4,为Spline-move曲线移动,\moves3(x1,y1,x2,y2,x3,y3,0,0),\moves4(x1,y1,x2,y2,x3,y3,0,0),

参数和move一样,如果是用于文字可以把最后两个坐标设置为音节的默认坐标,设置的参数和生成的效果
  1. \moves4($scenter,!$smiddle+100!,$scenter,!$smiddle-100!,$scenter,!$smiddle+100!,$scenter,$smiddle,0,1000)
复制代码
图27.png


图28.png


36_1. 关于moves3的应用,除了上面的用法,也可以把moves3的参数修改一下变成更好看的入场效果,代码如下
  1. 第一行:!char_counter(1)!!retime("start2syl",-700+(ci[1]-1)*50,0)!{\moves3($x,!$y+100!,$x,!$y-100!,$x,$y,0,400)\fry!math.random(-50,100)!\frz!math.random(-90,90)!\fry!math.random(-100,200)!\t(0,700,\frx0\frz0\fry0)\bord!1*ratio!\blur!6*ratio!\alpha255\3c!_G.ass_color(_G.HSV_to_RGB((ci[1]-1)/cn*360,1,1))!}
复制代码
  1. 第二行:!char_counter(1)!!retime("start2syl",-700+(ci[1]-1)*50,0)!{\moves3($x,!$y-100!,$x,!$y+100!,$x,$y,0,400)\fry!math.random(-50,100)!\frz!math.random(-90,90)!\fry!math.random(-100,200)!\t(0,700,\frx0\frz0\fry0)\bord!1*ratio!\blur!6*ratio!\alpha255\3c!_G.ass_color(_G.HSV_to_RGB((ci[1]-1)/cn*360,1,1))!}
复制代码
图29.png

上面使用的ASS文件: cx.rar (175.54 KB, 下载次数: 816)


36_2. 这里使用的是$x,$y,为什么不使用$center,或者$middle,$x,表示获取样式设置的x轴的坐标,如果是使用$scenter,或者$center,大家或许会发现在样式里面修改坐标没用,对音节(词)没用影响



36_3. 上面的代码生成的入场效果为,文字在400毫秒内从距离默认$y坐标的100像素的下方,也就是 $y+100 移动到$y坐标
的上方100像素, $y-100 的位置,期间通过绕fry/x/z轴产生随机旋转的效果,最后回到默认的坐标位置


图30.png


36_4. 上面的效果需要相同的两行代码,需要修改修改一下$y的坐标,上面的坐标为$y+100,下面的第二行的坐标就为
$y-100


图31.png



36_5. 如果我们在修改一下x轴的坐标会发生什么,代码如下
  1. !char_counter(1)!!retime("start2syl",syl.i*50-500,0)!{\moves3(!$x-200!,!$y-50!,!$x+200!,!$y-50!,$x,$y,0,400)\fry180\frz180\frx180\t(0,700,\frx0\frz0\fry0)\bord!1*ratio!\blur!6*ratio!\alpha255\3c!_G.ass_color(_G.HSV_to_RGB((ci[1]-1)/cn*360,1,1))!}
复制代码
图32.png

上面使用的ASS文件: cx2.rar (18.78 KB, 下载次数: 832)

36_6. 上面代码的表现的入场效果为,文字在400毫秒内从开始坐标x-200,y-50 的位置,绕frx/y/z轴180度,慢慢旋转到
0度,也就是默认无旋转,并移动到x+200,y+50 的位置,最后移动到默认x和y轴的默认位置

图33.png


36_7. 个人技术有限,关于moves3也就介绍这么多,其实moves4也是一样的,大家有兴趣可以尝试一下修改其它的参数来
实现更好的表现效果



37.如果新手觉得可以的话也可以用temp写进入或者退场的效果,用tcax写表现效果也可以,相互使用,感觉讲解的

也差不多的了,没什么细节问题了,剩下的就是需要新手多去练习,熟悉temp后再去用tcax写py特效脚本,那时候

你就会发现,tcax也不是那么的难,希望对新手们有所帮助







Rank: 4

沙发
发表于 2018-4-19 16:24:31 |只看该作者
感觉还是PDF里面的格式比较好,虽然没有代码

正式会员

妖木

Rank: 4

板凳
发表于 2018-4-19 16:50:25 |只看该作者
牛批

Rank: 4

地板
发表于 2018-4-19 17:07:48 |只看该作者
mzlmcx 发表于 2018-4-19 16:50
牛批

Rank: 4

5#
发表于 2018-4-29 01:24:37 |只看该作者
更新了一下后面的moves3和moves4
您需要登录后才可以回帖 登录 | 新人加入

GitHub|TCAX 主页

GMT+8, 2024-4-20 09:22

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部
RealH