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

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

[完整特效] [J]028_Nurarihyon_OP特效py脚本 [复制链接]

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

跳转到指定楼层
楼主
发表于 2011-8-10 06:20:23 |只看该作者 |倒序浏览
说明: 以下脚本需要用到small_code中的tu2lis函数(作用是将图形转换成点).
关于small_code模块, 我已经获得了small大的授权, 以后将以拓展模块的形式发布TCAX兼容(二次修改)版.

关于此脚本我就不做太多解释了, 如有问题, 请直接在此跟帖.
  1. from tcaxPy import *
  2. from extLibs.small_code import *

  3. def tcaxPy_Init():
  4.     global _FD          # 一帧的时间
  5.     global _Fs                # 字体大小
  6.     global FontBord        # 首要字体
  7.     _FD = 1000 / GetVal(val_FXFPS)
  8.     _Fs = GetVal(val_FontSize)
  9.     FontBord = InitFont(GetVal(val_FontFileName), GetVal(val_FaceID), _Fs, GetVal(val_Spacing), GetVal(val_SpaceScale), MakeRGB(0, 0, 0), 2, 0)

  10. def tcaxPy_Fin():
  11.     FinFont(FontBord)

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

  13.     ASS_BUF  = []        # 保存ASS特效
  14.     TCAS_BUF = []        # 保存TCAS特效

  15.     ##### 主要特效编写操作 #####

  16.     dx = _x - int(_a / 2 + 0.5)                # 一个固定操作, 将an5的坐标转换为an7
  17.     dy = _y - int(_Fs / 2 + 0.5)        # ASS特效默认采用an5坐标, TCAS特效则采用an7坐标

  18.     ts_0 = _start - 40 + 2 * _FD / 10 * _j
  19.     ts = ts_0 + 40
  20.     te = _end - 2 * _FD / 10 * (_n - _j - 1)
  21.     te_0 = te + 40

  22.     # 入场效果

  23.     ass_main(ASS_BUF, SubL(Start = ts_0, End = ts_0 + 40, Layer = 1), mov(_x + 50, _y - 20, _x, _y) + fad(300, 0) + bord(3) + blur(2), _txt)
  24.     ass_main(ASS_BUF, SubL(Start = ts_0, End = ts_0 + 40, Layer = 2), mov(_x + 50, _y - 20, _x, _y) + fad(300, 0) + bord(1) + color3('000000'), _txt)
  25.     ass_main(ASS_BUF, SubL(Start = ts_0, End = ts_0 + 40, Layer = 3), mov(_x + 50, _y - 20, _x, _y) + fad(300, 0) + bord(0), _txt)


  26.     # 存在效果 + 随机噪声效果

  27.     PIX = TextPix(FontBord, _txt)    # get the pixel info
  28.     PIX_t = PIX
  29.     duration = te - ts
  30.     count = int(duration * 10 / _FD)      # 闪光次数

  31.     if _j == 0:
  32.         global rp
  33.         rp = []
  34.         num = int((_end + 50 - _start) * 10 / _FD)
  35.         for i in range(num):
  36.             rp.append((randint(0, 1), randint(0, 1)))

  37.     offset = 2 * _j
  38.     for i in range(count):
  39.         PIX_color = list(PIX_t[2])
  40.         width = PIX_t[1][0]
  41.         height = PIX_t[1][1]
  42.         for j in range(randint(6, 10)):    # 闪光点个数
  43.             xr = randint(5, _a - 5)
  44.             yr = randint(0, _Fs - 5)
  45.             R_IMG = RandImg(randint(1, 3), randint(1, 4), randint(1, 4))
  46.             points = tu2lis(R_IMG)                # function borrowed from small_code library
  47.             num = len(points)
  48.             for m in range(num):
  49.                 w = int(points[m][0]) + xr
  50.                 if w >= width:
  51.                     continue
  52.                 h = int(points[m][1]) + yr
  53.                 if h >= height:
  54.                     continue
  55.                 index = (h * width + w) * 4
  56.                 if PIX_color[index + 3] != 0:
  57.                     PIX_color[index + 3] = -1
  58.         num = height * width * 4
  59.         for j in range(0, num, 4):
  60.             if PIX_color[j + 3] != -1:
  61.                 PIX_color[j + 3] = 0
  62.             else:
  63.                 PIX_color[j + 0] = 255
  64.                 PIX_color[j + 1] = 255
  65.                 PIX_color[j + 2] = 255
  66.                 PIX_color[j + 3] = PIX_t[2][j + 3]
  67.         PIX = (PIX_t[0], PIX_t[1], tuple(PIX_color))
  68.         if (10 * ts + i * _FD >= 10 * (_start + _elapk + _k + 5)) or (10 * ts + (i + 1) * _FD < 10 * (_start + _elapk - 5)):
  69.             tcas_main(TCAS_BUF, PIX, 10 * ts + i * _FD, 10 * ts + (i + 1) * _FD, dx + rp[i + offset][0], dy + rp[i + offset][1], 0)
  70.         ass_main(ASS_BUF, SubL(Start = ts + i * _FD / 10, End = ts + (i + 1) * _FD / 10, Layer = 1), pos(_x + rp[i + offset][0], _y + rp[i + offset][1]) + bord(3) + blur(2), _txt)
  71.         ass_main(ASS_BUF, SubL(Start = ts + i * _FD / 10, End = ts + (i + 1) * _FD / 10, Layer = 2), pos(_x + rp[i + offset][0], _y + rp[i + offset][1]) + bord(1) + color3('000000'), _txt)
  72.         ass_main(ASS_BUF, SubL(Start = ts + i * _FD / 10, End = ts + (i + 1) * _FD / 10, Layer = 3), pos(_x + rp[i + offset][0], _y + rp[i + offset][1]) + bord(0), _txt)


  73.     # 特效表现效果

  74.     C3 = '0000FF'

  75.     EFT1 = animation2(0, 4 * _k + 50, 1.3, fs(55) + blur(6) + bord(6) + color3(C3))
  76.     EFT2 = animation1(0, 2 * _k + 50, color1('FFFFFF')) + alpha1(0) + be(1)
  77.     ass_main(ASS_BUF, SubL(Start = _start + _elapk - 5, End = _start + _elapk + _k / 2, Layer = 6), pos(_x, _y) + EFT1 + EFT2, _txt)
  78.     EFT1 = fs(55) + blur(6) + bord(6) + color3(C3) + animation2(_k + 50, 5 * _k + 50, 0.8, fs(_Fs) + blur(0) + bord(0) + color3('FF8A15'))
  79.     EFT2 = color1('FFFFFF') + animation1(0, 3 * _k, color1(C3)) + animation1(3 * _k, 5 * _k + 50, color1('FF8A15')) + alpha1(0) + be(1)
  80.     ass_main(ASS_BUF, SubL(Start = _start + _elapk + _k / 2, End = _start + _elapk + _k + 5, Layer = 6), pos(_x, _y) + EFT1 + EFT2, _txt)
  81.     EFT = color1('FFFFFF') + alpha3(255) + be(1) + animation2(0, 4 * _k + 50, 1.3, fs(53))
  82.     ass_main(ASS_BUF, SubL(Start = _start + _elapk - 5, End = _start + _elapk + _k * 6 / 10 + 5, Layer = 6), pos(_x, _y) + EFT, _txt)
  83.     EFT = color1('FFFFFF') + alpha3(255) + be(1) + fs(53) + animation2(0, 4 * _k, 0.8, fs(_Fs))
  84.     ass_main(ASS_BUF, SubL(Start = _start + _elapk + _k * 6 / 10 + 5, End = _start + _elapk + _k + 5, Layer = 6), pos(_x, _y) + EFT, _txt)

  85.     EFT1 = animation2(0, 4 * _k + 50, 1.3, fs(50) + blur(6) + bord(6) + color3(C3))
  86.     EFT2 = animation1(0, 2 * _k + 50, color1('FFFFFF')) + be(1) + alpha1(0)
  87.     ass_main(ASS_BUF, SubL(Start = _start + _elapk - 5, End = _start + _elapk + _k / 2, Layer = 7), pos(_x, _y) + EFT1 + EFT2, _txt)
  88.     EFT1 = fs(50) + blur(6) + bord(6) + color3(C3) + animation2(_k + 50, 5 * _k + 50, 0.8, fs(_Fs) + blur(0) + bord(0) + color3('FF8A15'))
  89.     EFT2 = color1('FFFFFF') + animation1(0, 3 * _k, color1(C3)) + animation1(3 * _k, 5 * _k + 50, color1('FF8A15')) + be(1) + alpha1(0)
  90.     ass_main(ASS_BUF, SubL(Start = _start + _elapk + _k / 2, End = _start + _elapk + _k + 5, Layer = 7), pos(_x, _y) + EFT1 + EFT2, _txt)
  91.     EFT = color1('FFFFFF') + alpha3(255) + be(1) + animation2(0, 4 * _k + 50, 1.3, fs(48))
  92.     ass_main(ASS_BUF, SubL(Start = _start + _elapk - 5, End = _start + _elapk + _k * 6 / 10 + 5, Layer = 7), pos(_x, _y) + EFT, _txt)
  93.     EFT = color1('FFFFFF') + alpha3(255) + be(1) + fs(48) + animation2(6 * _k + 100, 10 * _k + 100, 0.8, fs(_Fs))
  94.     ass_main(ASS_BUF, SubL(Start = _start + _elapk + _k * 6 / 10 + 5, End = _start + _elapk + _k + 5, Layer = 7), pos(_x, _y) + EFT, _txt)


  95.     # 出场效果

  96.     offset += count
  97.     num = int(400 / _FD)
  98.     te = ts + count * _FD / 10
  99.     for i in range(num):
  100.         ass_main(ASS_BUF, SubL(Start = te + i * _FD / 10, End = te + (i + 1) * _FD / 10, Layer = 1), pos(_x + rp[i + offset][0], _y + rp[i + offset][1]) + alpha(255 * i / num) + bord(3) + blur(2), _txt)
  101.         ass_main(ASS_BUF, SubL(Start = te + i * _FD / 10, End = te + (i + 1) * _FD / 10, Layer = 2), pos(_x + rp[i + offset][0], _y + rp[i + offset][1]) + alpha(255 * i / num) + bord(1) + color3('000000'), _txt)
  102.         ass_main(ASS_BUF, SubL(Start = te + i * _FD / 10, End = te + (i + 1) * _FD / 10, Layer = 3), pos(_x + rp[i + offset][0], _y + rp[i + offset][1]) + alpha(255 * i / num) + bord(0), _txt)


  103.     ##### 将结果返回给tcax进行处理 #####

  104.     return (ASS_BUF, TCAS_BUF)
复制代码
预览请见此帖: http://www.tcax.org/forum.php?mod=viewthread&tid=43

文件名为: [J]028_Nurarihyon_OP.mkv



2

查看全部评分

Super Moderator

{\clip\t(\clip)}∀.I.R.nesSub

Rank: 6Rank: 6

沙发
发表于 2011-8-10 06:42:19 |只看该作者
本帖最后由 BurySakura 于 2011-8-10 07:06 编辑

我想到的是XX大的字体clip+ASS图形。
不过那白点一定要图形转么?
随机取字上面一像素,然后随机扩散点(好像不怎么好控制?

Ps1.牛奶你K的时候点扩散到边框去了。
Ps2. 我的用户组都可以切换。

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

板凳
发表于 2011-8-10 12:25:46 |只看该作者
BurySakura 发表于 2011-8-10 06:42
我想到的是XX大的字体clip+ASS图形。
不过那白点一定要图形转么?
随机取字上面一像素,然后随机扩散点(好 ...

没用clip是出于效率考虑. (<--可能是思路没想对吧, 感觉使用clip效率会很低

有考虑过随机填充 (-->因为有更简单的方法, 于是就用了嘛...

p.s.1 K的时候? 不过白点扩散到边框是故意的, 照着Staff弄的...

p.s.2 这样很好-0-

Super Moderator

{\clip\t(\clip)}∀.I.R.nesSub

Rank: 6Rank: 6

地板
发表于 2011-8-10 12:35:49 |只看该作者
本帖最后由 BurySakura 于 2011-8-10 12:37 编辑
milkyjing 发表于 2011-8-10 12:25
没用clip是出于效率考虑. (因为有更简单的方法, 于是就用了嘛...

p.s.1 K的时候? 不过白点扩散到边框是 ...


嘛,clip到字体本来就完全没有效率可言。
Ps1.人家边框是白的没看出来,但是你是红的。
Ps2. 你睡醒了啊!

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

5#
发表于 2011-8-10 12:38:40 |只看该作者
BurySakura 发表于 2011-8-10 12:35
嘛,clip到字体本来就完全没有效率可言。
Ps1.人家边框是白的没看出来,但是你是红的。 ...


我明白了, 恩, 确实会有这个问题, 是个BUG,

要修复也挺简单的....

待会我问问猎人看看改不改好了....  (2011-08-10 13:03 编辑: 还是改了吧....我现在自己看着也觉得不爽 -_-|)

p.s. 昨天我自己居然没发现 >.<

p.s.2 恩 >.<

其实特效很早就弄完了, 纠结了4个多小时的t代码-_-|

p.s.3 貌似听说一句话使用很多个t不如拆分成多句话使用单个(或更少的)t... 改了之后发现效果不明显....

-------------------------------- 2011-08-10 13:44 编辑 ------------------------------

修正了萌葬提到的那个BUG....




Super Moderator

{\clip\t(\clip)}∀.I.R.nesSub

Rank: 6Rank: 6

6#
发表于 2011-8-10 14:22:51 |只看该作者
本帖最后由 BurySakura 于 2011-8-10 14:28 编辑
milkyjing 发表于 2011-8-10 12:38
我明白了, 恩, 确实会有这个问题, 是个BUG,

要修复也挺简单的....


嘛,关于ASS的资源节省:
1.内嵌的话,不纠结了,只要能压出来,效果满意,我自己没怎么刻意去压缩代码跟考虑\t个数的使用,\clip除外,因为VSFliter有内存泄漏的BUG。
2.外挂的话,基本上就是怎么写文件小就怎么写。

Super Moderator

{\clip\t(\clip)}∀.I.R.nesSub

Rank: 6Rank: 6

7#
发表于 2011-10-21 12:35:39 |只看该作者
根据我的尝试,small_code中的tu2lis函数生成的点列表只是矢量图形的边界。
求牛奶证实。

而现在我想实现矢量像素化,除了加载图形库,只能想到把边界的点算出来,然后用EvenOdd 方式填充。
跟XX大也交流过,XX大用的是生成avs+ass,走avisynth接口渲染,读像素。这个暂时不知道该如何实现。
牛奶是怎么实现的?

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

8#
发表于 2011-10-21 18:49:43 |只看该作者
BurySakura 发表于 2011-10-21 12:35
根据我的尝试,small_code中的tu2lis函数生成的点列表只是矢量图形的边界。
求牛奶证实。


没研究过small大那代码, 不知道具体啥功能 (直接去问他本人吧)

这种技术确切地说叫光栅化 (rasterization), 应该能Google出不少东西的, 最简单的方法大概是直接用PyCairo了...

FreeType里用的好像是ScanLine.

关于填充应该有不少算法的 (flood fill, seed fill, scan line啥的)

Super Moderator

{\clip\t(\clip)}∀.I.R.nesSub

Rank: 6Rank: 6

9#
发表于 2011-10-21 19:35:47 |只看该作者
milkyjing 发表于 2011-10-21 18:49
没研究过small大那代码, 不知道具体啥功能 (直接去问他本人吧)

这种技术确切地说叫光栅化 (rasterizatio ...

好吧!

正式会员

爱理人士

Rank: 4

10#
发表于 2012-1-17 13:08:36 |只看该作者
想修改噪点和主体颜色  在哪里修改啊?
把所有颜色代码改了 还是看不出来....

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

11#
发表于 2012-1-17 13:13:57 |只看该作者
5231251 发表于 2012-1-17 13:08
想修改噪点和主体颜色  在哪里修改啊?
把所有颜色代码改了 还是看不出来.... ...

噪点颜色在 77到79行, (分别是r, g, b分量, 从0~255)
主体边框颜色在第91行...

正式会员

爱理人士

Rank: 4

12#
发表于 2012-1-17 13:51:53 |只看该作者
milkyjing 发表于 2012-1-17 13:13
噪点颜色在 77到79行, (分别是r, g, b分量, 从0~255)
主体边框颜色在第91行...

自己果然还是改不好  达不到想要的效果
想要血色的主体  白色的噪点  eft也改成红色  就是比较血腥点的感觉

lovey.jpg

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

13#
发表于 2012-2-28 12:23:34 |只看该作者
5231251 发表于 2012-1-17 13:51
自己果然还是改不好  达不到想要的效果
想要血色的主体  白色的噪点  eft也改成红色  就是比较血腥点的感 ...

突然翻到这个帖子...

正好, 最近那个Another OP 特效, 看起来就蛮血腥的..

正式会员

爱理人士

Rank: 4

14#
发表于 2012-3-2 16:49:57 |只看该作者
milkyjing 发表于 2012-2-28 12:23
突然翻到这个帖子...

正好, 最近那个Another OP 特效, 看起来就蛮血腥的.. ...

  去看看!  最近养病在 都没怎么来坛子....

Rank: 5Rank: 5

15#
发表于 2012-3-3 01:49:36 |只看该作者
5231251 发表于 2012-3-2 16:49
去看看!  最近养病在 都没怎么来坛子....

要注意身体哟~

正式会员

爱理人士

Rank: 4

16#
发表于 2012-3-3 11:24:05 |只看该作者
six 发表于 2012-3-3 01:49
要注意身体哟~

您需要登录后才可以回帖 登录 | 新人加入

GitHub|TCAX 主页

GMT+8, 2024-11-22 01:25

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部
RealH