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

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

[完整特效] [J]032_Gundam_Seed_OP特效脚本 (附完整工程) [复制链接]

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

跳转到指定楼层
楼主
发表于 2012-1-4 20:33:23 |只看该作者 |正序浏览
说明, 如果要直接执行本脚本, 请升级TCAX到最新版 (1.0.0), 附件为完整工程
说明2, 近期会陆续更新TCAS使用教程...
  1. from tcaxPy import *
  2. from pixLibs.ImageStone import *

  3. def tcaxPy_Init():
  4.     global _Fs
  5.     global _FD          # 一帧的持续时间, 约40毫秒
  6.     global Font         # 首要字体
  7.     global FontOut      # 字体边框
  8.     global FontOut2     # 字体边框2
  9.     global FontAll      # 加粗字体
  10.     _Fs = GetVal(val_FontSize)
  11.     _FD = 1000 / GetVal(val_FXFPS)
  12.     _FontFileName = GetVal(val_FontFileName)
  13.     _FaceID = GetVal(val_FaceID)
  14.     Font = InitFont(_FontFileName, _FaceID, _Fs, GetVal(val_Spacing), GetVal(val_SpaceScale), 0xFFFFFF, 0, 0)
  15.     FontOut = InitFont(_FontFileName, _FaceID, _Fs, GetVal(val_Spacing), GetVal(val_SpaceScale), 0xFFFFFF, 4, 1)
  16.     FontOut2 = InitFont(_FontFileName, _FaceID, _Fs, GetVal(val_Spacing), GetVal(val_SpaceScale), 0xFFFFFF, 2, 1)
  17.     FontAll = InitFont(_FontFileName, _FaceID, _Fs, GetVal(val_Spacing), GetVal(val_SpaceScale), 0xFFFFFF, 4, 0)

  18. def tcaxPy_Fin():
  19.     FinFont(Font)
  20.     FinFont(FontOut)
  21.     FinFont(FontOut2)
  22.     FinFont(FontAll)

  23. # 用户修订版的tcaxPy_Main函数, 保留原始tcaxPy_Main风格是为了减少额外记忆量, 实际上该函数形式可以非常多样化
  24. def tcaxPy_Main_Fake(_i, _j, _n, _start, _end, _elapk, _k, _x, _y, _a, _txt, param):
  25.     ASS_BUF  = []        # 保存ASS特效
  26.     TCAS_BUF = []        # 保存TCAS特效
  27.     ##### 主要特效编写操作 ####
  28.     dx = _x - int(_a / 2 + 0.5)     # 一个固定操作, 将an5的坐标转换为an7
  29.     dy = _y - int(_Fs / 2 + 0.5)    # ASS特效默认采用an5坐标, TCAS特效则采用an7坐标
  30.     # 文字主体
  31.     PIX = TextPix(Font, _txt)
  32.     PIX_t = pstGradient(PIX, 4, abs(PIX[0][0]), \
  33.                               PIX[1][1] - abs(PIX[0][1]) - PIX[1][1], \
  34.                               abs(PIX[0][0]) + PIX[1][0], \
  35.                               PIX[1][1] - abs(PIX[0][1]), \
  36.                               DecRGB('8080FF'), DecRGB('0000FF'), 0)
  37.     # 边框主体
  38.     PIX = TextPix(FontOut, _txt)
  39.     PIX = PixColorRGB(PIX, DecRGB('000040'))
  40.     PIX_o = pstBlur(PIX, 0, 6)
  41.     # 边框
  42.     PIX = TextPix(FontOut2, _txt)
  43.     PIX = PixColorRGB(PIX, DecRGB('AAAAAA'))
  44.     PIX_b = pstBlur(PIX, 2, 4)
  45.     # 底色
  46.     PIX = TextPix(FontAll, _txt)
  47.     PIX = PixColorRGB(PIX, DecRGB('800080'))
  48.     PIX_s = pstBlur(PIX, 0, 18)
  49.     # 混合
  50.     PIX = CombinePixs(PIX_s, PIX_o)
  51.     PIX = CombinePixs(PIX, PIX_b)
  52.     PIX = CombinePixs(PIX, PIX_t)
  53.     # 增加效果
  54.     PIX = pstBlind(PIX, 0, PIX[1][0], 40, DecRGB('000040'))
  55.     ### 增加到 BIG_PIX 当中, BIG_PIX保存在param的第一个元素处, 关于BIG_PIX用法, 请看专门教程
  56.     BigPixAdd(param[0], PIX, dx, dy, 0)
  57.     # 一些时间的计算
  58.     T0 = 10 * _start - 10 * _FD + 1 * _j * _FD
  59.     T1 = T0 + 4 * _FD
  60.     T2 = 10 * _end + 5 * _FD - 2 * (_n - _j - 1) * _FD
  61.     T3 = T2 + _FD * 4
  62.     # IN 进入方式
  63.     tcas_keyframe(TCAS_BUF, PixBlur(PixColorMul(PIX, 1, 1, 1, 0.2), 10), PIX, T0, T1, dx, dy, 1, 0)
  64.     # MAIN 存在方式
  65.     tcas_main(TCAS_BUF, PIX, T1, T2, dx, dy, 0)
  66.     # OUT 消失方式
  67.     tcas_keyframe(TCAS_BUF, PIX, PixColorMul(PixBlur(PIX, 16), 1, 1, 1, 0), T2, T3, dx, dy, 1, 0)
  68.     # EFT 表现方式
  69.     PIX_0 = PIX
  70.     num = int(ceil(_k * 10 / _FD))
  71.     for i in range(num):
  72.         T_s = 10 * (_start + _elapk) + i * _FD
  73.         T_e = T_s + _FD
  74.         PIX2 = PixResize(PIX_0, PIX_0[1][0] * 1.3, 0)
  75.         dx2 = dx - PIX2[0][0] + PIX_0[0][0] - (PIX2[1][0] - PIX_0[1][0]) / 2
  76.         dy2 = dy - PIX2[0][1] + PIX_0[0][1] - (PIX2[1][1] - PIX_0[1][1]) / 2
  77.         if i % 2 == 0:
  78.             PIX = pstSoftGlow(PIX2, 10, randint(160, 180), randint(140, 160))
  79.         else:
  80.             PIX = pstSoftGlow(PIX2, 10, randint(60, 80), randint(80, 100))
  81.         tcas_main(TCAS_BUF, PIX, T_s, T_e, dx2, dy2, 3)
  82.     ##### 将结果返回给tcax进行处理 #####
  83.     return (ASS_BUF, TCAS_BUF)

  84. def tcaxPy_User():
  85.     file_name = GetVal(val_OutFile) + '.tcas'
  86.     fx_width = GetVal(val_ResolutionX)
  87.     fx_height = GetVal(val_ResolutionY)
  88.     fx_fps = GetVal(val_FXFPS)
  89.     TCAS_FILE = CreateTcasFile(file_name, fx_width, fx_height, fx_fps)
  90.     # basic metrics
  91.     fontSize   = GetVal(val_FontSize)
  92.     marginX    = GetVal(val_OffsetX)
  93.     marginY    = GetVal(val_OffsetY)
  94.     spacing    = GetVal(val_Spacing)
  95.     lineNum    = GetVal(val_nLines)
  96.     textNum    = GetVal(val_nTexts)
  97.     start      = GetVal(val_BegTime)
  98.     end        = GetVal(val_EndTime)
  99.     kar        = GetVal(val_KarTime)
  100.     elapKar    = GetVal(val_KarTimeDiff)
  101.     text       = GetVal(val_Text)
  102.     textLength = GetVal(val_TextLength)
  103.     advance    = GetVal(val_TextAdvance)
  104.     advDiff    = GetVal(val_TextAdvanceDiff)
  105.     # main loop
  106.     for i in range(lineNum):
  107.         initPosX = (fx_width - textLength[i]) / 2 + marginX        # if marginX = 0, then it's just on the middle
  108.         initPosY = marginY
  109.         BIG_PIX = InitBigPix()
  110.         for j in range(textNum[i]):
  111.             if text[i][j] == '' or text[i][j] == ' ' or text[i][j] == ' ':
  112.                 continue
  113.             posX = initPosX + advDiff[i][j] + advance[i][j] / 2
  114.             posY = initPosY + fontSize / 2
  115.             foo_bar = 0     # 实际上想传什么样的参数, 完全由我们自己决定, 数量也不受限制
  116.             param = [BIG_PIX, foo_bar]
  117.             ASS_BUF, TCAS_BUF = tcaxPy_Main_Fake(i, j, textNum[i], start[i], end[i], elapKar[i][j], kar[i][j], posX, posY, advance[i][j], text[i][j], param)
  118.             WriteTcasFile(TCAS_FILE, TCAS_BUF)
  119.             Progress(i, j)
  120.         PIX_mask = ConvertBigPix(BIG_PIX)
  121.         num = textNum[i] + 6
  122.         PIX_i = ImagePix(abspath('flare3.png'), PIX_mask[1][0], PIX_mask[1][1])
  123.         for ii in range(num):
  124.             TCAS_BUF = []
  125.             PIX = ((PIX_mask[0][0] + PIX_i[1][0] * (-0.5 + (ii + 1) / num), PIX_mask[0][1]), PIX_i[1], PIX_i[2])
  126.             PIX = PixMask(PIX, PIX_mask)
  127.             PIX = PixColorMul(PIX, 1, 1, 1, linearFactor(-0.5 + ii / num))
  128.             tcas_main(TCAS_BUF, PIX, start[i] * 10 - 6 * _FD + ii * _FD, start[i] * 10 - 6 * _FD + (ii + 1) * _FD, 0, 0, 1)
  129.             WriteTcasFile(TCAS_FILE, TCAS_BUF)
  130.             #progress(ii + 1, num)
  131.         PIX_i = ImagePix(abspath('flare1.png'), PIX_mask[1][0], PIX_mask[1][1])
  132.         for ii in range(num):
  133.             TCAS_BUF = []
  134.             PIX = ((PIX_mask[0][0] + PIX_i[1][0] * (-0.5 + (ii + 1) / num), PIX_mask[0][1]), PIX_i[1], PIX_i[2])
  135.             PIX = PixMask(PIX, PIX_mask)
  136.             PIX = PixColorMul(PIX, 1, 1, 1, sqrFactor(-0.5 + ii / num))
  137.             tcas_main(TCAS_BUF, PIX, start[i] * 10 - 6 * _FD + ii * _FD, start[i] * 10 - 6 * _FD + (ii + 1) * _FD, 0, 0, 1)
  138.             WriteTcasFile(TCAS_FILE, TCAS_BUF)
  139.             #progress(ii + 1, num)
  140.     FinTcasFile(TCAS_FILE)


  141. def sqrFactor(x):
  142.     return -4 * (x - 0.5) * (x + 0.5)

  143. def linearFactor(x):
  144.     if x < 0:
  145.         return 2 * x + 1
  146.     else:
  147.         return -2 * x + 1
复制代码

Gundam_Seed_OP.rar

73.08 KB, 下载次数: 7398

完整工程

2

查看全部评分

Rank: 4

31#
发表于 2013-10-29 07:37:18 |只看该作者
milkyjing 发表于 2013-10-28 23:18
an是针对ASS特效的, 还影响 OffsetX, OffsetY的值, (也就是字幕的初始位置).

对TCAS特效不影响. 坐标轴 ...

恩恩 原来如此 ~ 奶大病好了没 各种蹭~

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

30#
发表于 2013-10-28 23:18:18 |只看该作者
yyxxlc 发表于 2013-10-27 16:38
奶大 刚刚突然发现这个脚本里  在fake里字的位置坐标是an7排的 在user里效果又是按照an8对齐和排坐标的(11 ...

an是针对ASS特效的, 还影响 OffsetX, OffsetY的值, (也就是字幕的初始位置).

对TCAS特效不影响. 坐标轴采用的是 视频左上角为坐标原点. 往右, 往下为正.

Rank: 4

29#
发表于 2013-10-27 16:38:38 |只看该作者
奶大 刚刚突然发现这个脚本里  在fake里字的位置坐标是an7排的 在user里效果又是按照an8对齐和排坐标的(111~112行) tcc设置按照an7对齐  这样....为什么会没问题 明明设置的位置不一样 为什么user里那个光飘过去的时候不会掉在字的外面? 好神奇的说

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

28#
发表于 2013-9-28 11:48:38 |只看该作者
yyxxlc 发表于 2013-9-27 07:37
早上一起床就看到奶大的回复  顿时觉得世界各!种!美!好!(瞬间清醒)
PS:乃们都在  我有啥好害怕的  ...

加油

Rank: 4

27#
发表于 2013-9-27 07:37:39 |只看该作者
本帖最后由 yyxxlc 于 2013-9-27 07:39 编辑
milkyjing 发表于 2013-9-26 23:51
1. 没有这个限制. 功能是: 指定两个关键帧, 在规定的时间内进行插值演变, 具体参数说明参考

http://www. ...


早上一起床就看到奶大的回复  顿时觉得世界各!种!美!好!(瞬间清醒)
PS:乃们都在  我有啥好害怕的 如果把我从小到大跳的坑排排队连在一起 大概也能绕地球两圈了! 好在PS我还是懂一些的 这边不懂的时候可以在ps上做一遍帮助理解  我大概还能多坚持一会儿!(乐)

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

26#
发表于 2013-9-26 23:51:12 |只看该作者
yyxxlc 发表于 2013-9-25 21:40
奶大~~  我想问问这个脚本里到处都找不到出处的东西...嘤嘤嘤
1、66行和70行的tcas_keyframe,是不是只在进 ...

1. 没有这个限制. 功能是: 指定两个关键帧, 在规定的时间内进行插值演变, 具体参数说明参考

http://www.tcax.org/docs/tcaxLib ... e414bcdc058f576d8b5

该链接可以从

http://www.tcax.org/forum.php?mo ... =1079&fromuid=2

这里得到.

2. ceil是python提供的函数, 取整用 (小数直接进1) (floor是去掉小数)

3. 参考 http://www.tcax.org/forum.php?mo ... 4&page=1#pid736

4. python语法中, 函数的调用和声明, 没有严格的顺序要求., 可以先调用, 在文件的最后才定义该函数.

在def tcaxPy_User(): 里面前面这么多行 好像只是定义了个空的 BIG_PIX 然后传送到上面去了是么?
是的, main_fake中将PIX添加到了BIG_PIX中. 使用了函数 BigPixAdd
我有试过在后面加个 print(BIG_PIX) pause  但是tcc很无情的告诉我文件太大了 所以它不给我看了!
为了应对这种情况, (以及其他一些原因), TCAX提供了函数tcaxLog, 可以用 tcaxLog(BIG_PIX) 试试, 会在工程目录下生成一个Log文件.


p.s. TCAS是个大坑. 你准备跳了么

Rank: 4

25#
发表于 2013-9-25 21:40:59 |只看该作者
本帖最后由 yyxxlc 于 2013-9-25 21:42 编辑

奶大~~  我想问问这个脚本里到处都找不到出处的东西...嘤嘤嘤
1、66行和70行的tcas_keyframe,是不是只在进入和退出时用? 它里边的结构是什么样的?
2、73行的 ceil 是什么函数呀
3、81和83里用的 pstSoftGlow 感觉应该是pixstone的函数 但是在那个函数记录的word里没有找到呢 它里面的结构是怎么样的?

4、看了很久的user自定义版的特效,一直觉得def tcaxPy_User(): 应该是定义了def tcaxPy_Main_Fake()里的各种参数,那理论上user应该写在fake前面才对啊  为什么大多数时候都写在后面也没问题 ? (好吧 我就是小白)  我有点疑惑124行的
  1. PIX_mask = ConvertBigPix(BIG_PIX)
复制代码
在def tcaxPy_User(): 里面前面这么多行 好像只是定义了个空的 BIG_PIX 然后传送到上面去了是么? 那124行合并图层的这个BIG_PIX  我猜测一定不可能是个空的pix(要不然干嘛做个合并动作),所以大概也许是从上面fake里又传回来的做了各种效果的BIG_PIX ?(以上全是我的猜测,我有试过在后面加个 print(BIG_PIX) pause  但是tcc很无情的告诉我文件太大了 所以它不给我看了! 真是傲娇)

    如果真的是从fake里传过来的BIG_PIX,这样也可以么,他们可是在不同的def里啊 而且也没看到什么传送门!  (以上全是臆测 如果全想错了 请不要pia我 所以说这到底是怎么一回事啊~泪)

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

24#
发表于 2012-1-7 19:50:38 |只看该作者
问题解决了, 的确是版本混乱造成的.

解决方法: 先删除目前机子上所有的TCAX程序(直接删除目录即可), 为测试是否已完全删除, 可通过Parse任一个TCC检查. 然后下载最新版, 解压后, 执行一遍assoc.exe, 即可...

如果以后挪动了TCAX程序的位置, 也注意重新执行assoc.exe


Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

23#
发表于 2012-1-7 18:34:19 |只看该作者
mzlmcx 发表于 2012-1-7 18:32
上扣扣……我文件夹全删了,重新换新版的也不能用啊……依然是找不到

跟他的情况一样 ...

恩, 回来一起查查原因.... 先吃饭去了...

正式会员

妖木

Rank: 4

22#
发表于 2012-1-7 18:32:07 |只看该作者
milkyjing 发表于 2012-1-7 17:54
删除早期版本(直接删除文件夹即可), 然后执行新版本中的assoc.exe, 对着TCC文件点鼠标右键, 选择 Parse,  ...

上扣扣……我文件夹全删了,重新换新版的也不能用啊……依然是找不到

跟他的情况一样

正式会员

妖木

Rank: 4

21#
发表于 2012-1-7 18:22:09 |只看该作者
5231251 发表于 2012-1-7 12:26

好吧……我的情况跟你的一样……囧

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

20#
发表于 2012-1-7 17:54:14 |只看该作者
5231251 发表于 2012-1-7 12:26

删除早期版本(直接删除文件夹即可), 然后执行新版本中的assoc.exe, 对着TCC文件点鼠标右键, 选择 Parse, 看看是什么情况?

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

19#
发表于 2012-1-7 17:44:49 |只看该作者
lijingjie 发表于 2012-1-7 14:53
我刚刚添加了print(lineNum)和Pause()语句测试了一下,很正常啊,真是奇了怪了!看我的截图。

这脚本我运行着也正常的...

@5231251  建议: 删除早期版本(直接删除文件夹), 同时执行新版本中的assoc.exe, 然后对着TCC文件点鼠标右键, 选择 Parse, 看看是什么情况?

@lijingjie 更新了 PixResize 以及 PixResizeF 对PIX 的定位算法(即PIX[0]的值与早先版本的不同), 使其符合以下PIX操作函数原则: 不管是何PIX操作函数, 再调用过后, 都不会改变PIX的定位, 定位的标准为PIX的中心.
举个例子: 如PixColorMul, 该函数只是调整PIX的颜色, 不会改变PIX的定位, 但如PixBlur, 该函数会增加PIX的宽和高, 为了减少调整坐标的麻烦 (通常我们希望PIX的中心位置不变-->因为这样看起来自然一些), 故PIX[0]会适量的往左上角偏移.

实际代码的改变
  1.     pPixDst->initX = pPixSrc->initX * pPixDst->width / pPixSrc->width;
  2.     pPixDst->initY = pPixSrc->initY * pPixDst->height / pPixSrc->height;
复制代码
调整为
  1.     pPixDst->initX = pPixSrc->initX - (pPixDst->width - pPixSrc->width) / 2;
  2.     pPixDst->initY = pPixSrc->initY - (pPixDst->height - pPixSrc->height) / 2;
复制代码
当然这只是一种默认定位方式, 如果有需要, 我们可以根据自己的方式修改PIX的定位, 如本脚本中的129, 138行那样操作...



Rank: 5Rank: 5

18#
发表于 2012-1-7 14:53:00 |只看该作者
本帖最后由 lijingjie 于 2012-1-7 15:02 编辑
5231251 发表于 2012-1-7 12:26


我刚刚添加了print(lineNum)和Pause()语句测试了一下,很正常啊,真是奇了怪了!看我的截图。

debug

另外想问一下牛奶大,二楼提供的tcaxLib.pyd都更新了什么?

正式会员

爱理人士

Rank: 4

17#
发表于 2012-1-7 12:26:44 |只看该作者
milkyjing 发表于 2012-1-7 00:28
109, 110行各加4个空格....

continue.jpg

then.jpg

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

16#
发表于 2012-1-7 00:28:56 |只看该作者
5231251 发表于 2012-1-7 00:23

109, 110行各加4个空格....

正式会员

爱理人士

Rank: 4

15#
发表于 2012-1-7 00:23:16 |只看该作者
milkyjing 发表于 2012-1-6 13:49
还真神奇了...

你在 第109行处插入如下代码吧

109.jpg

1090.jpg

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

14#
发表于 2012-1-6 13:49:12 |只看该作者
5231251 发表于 2012-1-6 13:31
是啊就是下载的完整工程  什么都没有改动......


还真神奇了...

你在 第109行处插入如下代码吧

print(lineNum)
Pause()

记得对齐... 我想看看结果...


正式会员

爱理人士

Rank: 4

13#
发表于 2012-1-6 13:31:35 |只看该作者
milkyjing 发表于 2012-1-6 09:26
用的是附件么, 有没有改过什么东西?

是啊就是下载的完整工程  什么都没有改动......
您需要登录后才可以回帖 登录 | 新人加入

GitHub|TCAX 主页

GMT+8, 2024-11-22 12:18

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部
RealH