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

 找回密码
 加入社区
查看: 1023|回复: 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 |显示全部楼层
厉害,学习了
您需要登录后才可以回帖 登录 | 加入社区

GitHub|TCAX 主页

GMT+8, 2018-10-24 07:42

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部
RealH