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

 找回密码
 新人加入
查看: 4481|回复: 5

[完整特效] [kawori] newgame_edfx [复制链接]

Moderator

Effect Researcher.

Rank: 5Rank: 5

发表于 2016-8-19 11:35:33 |显示全部楼层
lens_distortion 效果,是上次 模拟透镜畸变效果 的后续。它们之间的区别是实现方法不同,上回是用粒子,这个是用矢量绘图代码。由于粒子方法会导致变化时字呈现栅格状,即使填充好也会产生锯齿(雾),所以更推荐矢量绘图的方法。
这个矢量绘图代码的框架是 milkyjing 大哥写的,请参考 放大镜效果 。其中 ImageSurface() Context() 是 util.cairo 模块的函数。AssDraw() path_trans() surface_clear() 则在 util/cairo/CairoAssist.py 中。总之,只需要 from util.cairo import* 即可。
片源、工程、成品字幕、预览见  http://pan.baidu.com/s/1pL2E63x 密码: th7p
  1. from tcaxPy import *
  2. from util.cairo import *


  3. def tcaxPy_Init():
  4.         global frameDur
  5.         global fontSize
  6.         global userFont
  7.         fontSize = GetVal(val_FontSize)
  8.         frameDur = 1000 / GetVal(val_FXFPS)
  9.         userFont = InitFont(GetVal(val_FontFileName), GetVal(val_FaceID), fontSize, GetVal(val_Spacing), GetVal(val_SpaceScale), DecRGB(GetVal(val_1C)), 0, 0)
  10.         # cairo
  11.         global ctx
  12.         vdWidth  = GetVal(val_ResolutionX)
  13.         vdHeight = GetVal(val_ResolutionY)
  14.         surface = ImageSurface(FORMAT_ARGB32, vdWidth, vdHeight)
  15.         ctx = Context(surface)

  16. def tcaxPy_Fin():
  17.         FinFont(userFont)

  18. def lens_filter(x, y, param):
  19.         orgx, orgy, f, frames = param
  20.         px = x / 64
  21.         py = y / 64
  22.         rx = px - orgx
  23.         ry = py - orgy
  24.         rsq = rx ** 2 + ry ** 2
  25.         rx = rx * (1 + 0.00002 * (frames - 1 - f) / (frames - 1) * rsq)
  26.         ry = ry * (1 + 0.00005 * (frames - 1 - f) / (frames - 1) * rsq)
  27.         px = (rx + orgx) * 64
  28.         py = (ry + orgy) * 64
  29.         return (px, py)

  30. def rand_filter(x, y, n):
  31.         rndx = randint(-n, n)
  32.         rndy = randint(-n, n)
  33.         return (x + rndx, y + rndy)

  34. def tcaxPy_Main(_i, _j, _n, _start, _end, _elapk, _k, _x, _y, _a, _txt):

  35.         ASS_BUF  = []        # used for saving ASS FX lines
  36.        
  37.         ux = _x
  38.         dx = (GetVal(val_ResolutionX) - GetVal(val_TextLength)[_i] * 2 - GetVal(val_OffsetX) * 2) + GetVal(val_TextLength)[_i]
  39.         orgx = GetVal(val_OffsetX) + GetVal(val_TextLength)[_i] / 2
  40.         orgy = GetVal(val_OffsetY) + fontSize / 2
  41.         if 17 <= _i <= 19:
  42.                 ux   += dx / 2
  43.                 orgx += dx / 2
  44.         elif _i % 2:
  45.                 ux   += dx
  46.                 orgx += dx
  47.         udx = ux - int(_a / 2 + 0.5)
  48.         udy = _y - int(fontSize / 2 + 0.5)
  49.         outline = TextOutlineDraw(userFont, _txt, udx, udy)
  50.        
  51.         frames = 14
  52.         eft = an(7) + pos(0, 0) + blur(2)
  53.        
  54.         for f in range(frames):
  55.                 ts = _start - (frames - f)  * frameDur / 10
  56.                 te = ts + frameDur / 10
  57.                 AssDraw(ctx, outline)
  58.                 path_trans(ctx, lens_filter, (orgx, orgy, f, frames))
  59.                 text = ToAssDraw(ctx)
  60.                 ass_main(ASS_BUF, SubL(ts, te), eft, '{\p7} ' + text + ' {\p0}')
  61.        
  62.         weft = pos(ux, _y) + blur(2)
  63.         ass_main(ASS_BUF, SubL(te, _start + _elapk), weft, _txt)
  64.         ass_main(ASS_BUF, SubL(_start + _elapk + _k, _end), weft, _txt)
  65.        
  66.         surface_clear(ctx)
  67.        
  68.         frames = int(10 * _k / frameDur + 0.5)
  69.         if 9 <= _i <= 16 or (_i == 8 and _j == _n - 1):
  70.                 n = 200
  71.         else:
  72.                 n = 100
  73.        
  74.         for f in range(frames):
  75.                 ts = _start + _elapk + f * frameDur / 10
  76.                 te = ts + frameDur / 10
  77.                 AssDraw(ctx, outline)
  78.                 path_trans(ctx, rand_filter, n)
  79.                 text = ToAssDraw(ctx)
  80.                 ass_main(ASS_BUF, SubL(ts, te), eft, '{\p7} ' + text + ' {\p0}')

  81.         return (ASS_BUF, None)
复制代码
1

查看全部评分

Rank: 4

发表于 2016-8-30 15:17:18 |显示全部楼层

Rank: 4

发表于 2016-9-11 20:45:46 |显示全部楼层
辛苦了

Rank: 4

发表于 2017-12-31 00:08:32 |显示全部楼层
非常感谢!

Rank: 4

发表于 2018-1-30 14:16:46 |显示全部楼层
谢谢楼主分享

Rank: 4

发表于 2018-7-3 23:14:04 |显示全部楼层
厉害,学习了

Rank: 4

发表于 2021-12-19 02:27:51 |显示全部楼层
本帖最后由 Seekladoom 于 2021-12-21 23:26 编辑

【透镜文字效果】TCAX Karaoke Effect 056.rar (241.21 KB, 下载次数: 1412)
1080P适配版本,精简了下代码:
  1. from tcaxPy import *
  2. from util.cairo import *
  3. #请使用VSFilterMod以外的滤镜插件,如xy-vsfilter.dll预览字幕文件。
  4. #因为此滤镜预览TCAX的cairo模块生成的【矢量文字】时会导致字幕错位和字号大小的显示出问题。

  5. def tcaxPy_Init():
  6.     global frameDur
  7.     global fontSize
  8.     global userFont
  9.     fontSize = GetVal(val_FontSize)
  10.     frameDur = 1000 / GetVal(val_FXFPS)
  11.     userFont = InitFont(GetVal(val_FontFileName), GetVal(val_FaceID), fontSize, GetVal(val_Spacing), GetVal(val_SpaceScale), DecRGB(GetVal(val_1C)), 0, 0)
  12.     # cairo
  13.     global ctx
  14.     vdWidth  = GetVal(val_ResolutionX)
  15.     vdHeight = GetVal(val_ResolutionY)
  16.     surface = ImageSurface(FORMAT_ARGB32, vdWidth, vdHeight)
  17.     ctx = Context(surface)

  18. def tcaxPy_Fin():
  19.     FinFont(userFont)

  20. #控制透镜文字位置
  21. def lens_filter(x, y, param):
  22.     orgx, orgy, f, frames = param
  23.     px = x / 64
  24.     py = y / 64
  25.     rx = px - orgx
  26.     ry = py - orgy
  27.     rsq = rx ** 2 + ry ** 2
  28.     rx = rx * (1 + 0.00002 * (frames - 1 - f) / (frames - 1) * rsq)
  29.     ry = ry * (1 + 0.00005 * (frames - 1 - f) / (frames - 1) * rsq)
  30.     px = (rx + orgx) * 64
  31.     py = (ry + orgy) * 64
  32.     return (px, py)

  33. #控制文字形变程度
  34. def rand_filter(x, y, n):
  35.     rndx = randint(-n, n)
  36.     rndy = randint(-n, n)
  37.     return (x + rndx, y + rndy)#关键待改之处2:x、y
  38.    
  39. def tcaxPy_Main(_i, _j, _n, _BT, _ET, _SK, _K, _X, _Y, _A, _TXT):
  40.     ASS_BUF  = []    # used for saving ASS FX lines
  41.    
  42.     #自定义坐标参数
  43.     ux = _X
  44.     dx = GetVal(val_ResolutionX) - GetVal(val_TextLength)[_i]
  45.     orgx = GetVal(val_OffsetX) + GetVal(val_TextLength)[_i] / 2
  46.     orgy = GetVal(val_OffsetY) + fontSize / 2
  47.      
  48.     #透镜转场效果:坐标计算
  49.     ux += dx / 2    #ux = ux + dx / 2
  50.     orgx += dx / 2  #orgx = orgx + dx / 2
  51.     udx = ux - int(_A / 2 + 0.5)
  52.     udy = _Y - int(fontSize / 2 + 0.5)
  53.    
  54.     #透镜转场效果:矢量文字绘图代码
  55.     outline = TextOutlineDraw(userFont, _TXT, udx, udy)
  56.     frames = 14
  57.     eft = an(7) + pos(5, _Y + 980) + blur(2)
  58.     for f in range(frames):
  59.         ts = _BT - (frames - f)  * frameDur / 10
  60.         te = ts + frameDur / 10
  61.         AssDraw(ctx, outline)
  62.         path_trans(ctx, lens_filter, (orgx, orgy, f, frames))
  63.         text = ToAssDraw(ctx)
  64.         ass_main(ASS_BUF, SubL(ts, te), eft + p(7), text)
  65.         
  66.     #普通文本
  67.     weft = an(7) + pos(ux - 20, _Y + 980) + blur(2)
  68.     ass_main(ASS_BUF, SubL(te, _BT + _SK), weft, _TXT)
  69.     ass_main(ASS_BUF, SubL(_BT + _SK + _K, _ET), weft, _TXT)
  70.    
  71.     #唱K文字绘图代码
  72.     frames = int(10 * _K / frameDur + 0.5)
  73.     n = 200
  74.     for f in range(frames):
  75.         ts = _BT + _SK + f * frameDur / 10
  76.         te = ts + frameDur / 10
  77.         AssDraw(ctx, outline)
  78.         path_trans(ctx, rand_filter, n)#关键待改之处1:长度【自适应问题】还没解决
  79.         text = ToAssDraw(ctx)
  80.         ass_main(ASS_BUF, SubL(ts, te), eft + p(7), text)

  81.     return (ASS_BUF, None)
复制代码

相关链接:
TCAX 时间计算及文字定位 (英文)
【具体位置可看键盘上的小键盘数字1-9的布局来强化记忆】
  1. 1.对齐方式 1,x = GetVal(val_OffsetX),y = GetVal(val_ResolutionY) - GetVal(val_FontSize) - GetVal(val_OffsetY)
  2. 2.对齐方式 2,x = GetVal(val_OffsetX) + (GetVal(val_ResolutionX) - GetVal(val_TextLength) [line_index]) / 2, y = GetVal(val_ResolutionY) - GetVal(val_FontSize) - GetVal(val_OffsetY)
  3. 3.对齐方式 3, x = GetVal(val_ResolutionX) - GetVal(val_TextLength)[line_index] - GetVal(val_OffsetX), y = GetVal(val_ResolutionY) - GetVal(val_FontSize) - GetVal(val_OffsetY)
  4. 4.对齐方式 4, x = GetVal(val_OffsetX), y = GetVal(val_ResolutionY) / 2 - GetVal(val_OffsetY)
  5. 5.对齐方式 5, x = GetVal(val_OffsetX) + (GetVal(val_ResolutionX) - GetVal(val_TextLength)[line_index]) / 2, y = GetVal(val_ResolutionY) / 2 - GetVal(val_OffsetY)
  6. 6.对齐方式 6, x = GetVal(val_ResolutionX) - GetVal(val_TextLength)[line_index] - GetVal(val_OffsetX), y = GetVal(val_ResolutionY) / 2 - GetVal(val_OffsetY)
  7. 7.对齐方式 7, x = GetVal(val_OffsetX), y = GetVal(val_OffsetY)
  8. 8.对齐方式 8, x = GetVal(val_OffsetX) + (GetVal(val_ResolutionX) - GetVal(val_TextLength)[line_index]) / 2, y = GetVal(val_OffsetY)
  9. 9.对齐方式 9, x = GetVal( val_ResolutionX) - GetVal(val_TextLength)[line_index] - GetVal(val_OffsetX), y = GetVal(val_OffsetY)
复制代码

Rank: 4

发表于 2021-12-21 02:29:06 |显示全部楼层
本帖最后由 Seekladoom 于 2021-12-21 23:34 编辑

补充:
如需使用Aegisub预览TCAX的cairo模块生成的ASS特效字幕,请在预览时避免使用VSFilterMod滤镜,因为此滤镜预览时会导致字幕错位和字号大小的显示出问题。
请更换为xy-vsfilter进行预览即可,压制的话依然使用VSFilterMod即可。

没想到会因为这个问题被卡了两天多。。。_(:з」∠)_

运行TCC文件所在的文件目录可以有中文但不宜过长,否则容易导致TCAX无法正常运行
您需要登录后才可以回帖 登录 | 新人加入

GitHub|TCAX 主页

GMT+8, 2024-6-22 16:27

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部
RealH