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

 找回密码
 新人加入
查看: 10659|回复: 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, 下载次数: 4833

完整工程

2

查看全部评分

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-1-4 20:43:40 |显示全部楼层
补上预览, http://www.tcax.org/forum.php?mod=viewthread&tid=43

文件名: [J]032_Gundam_Seed_OP.mkv


至少需要tcax 1.0.0 sp1, (建议直接升级到最新版), 如果是旧版本,

tcaxLib.pyd 替换 TCAX 程序根目录下的同名文件...


Gundam_Seed_OP.rar

77.07 KB, 下载次数: 4922

V2

tcaxLib.pyd

561 KB, 下载次数: 4372

基于1.0.0的更新

正式会员

爱理人士

Rank: 4

发表于 2012-1-5 12:16:48 |显示全部楼层
milkyjing 发表于 2012-1-4 20:43
补上预览, http://www.tcax.org/forum.php?mod=viewthread&tid=43

文件名: [J]032_Gundam_Seed_OP.mkv ...

032.jpg

Rank: 5Rank: 5

发表于 2012-1-5 14:51:13 |显示全部楼层
呵呵~差一点被tcaxPy_Main_Fake函数给蒙住了,原来是自定义函数,长的跟tcaxPy_Main函数太像了,在tcaxPy_User函数中被调用。这个脚本对学习使用tcaxPy_User函数很有帮助,多谢牛奶大!

Moderator

youkaze

Rank: 5Rank: 5

发表于 2012-1-5 17:59:35 |显示全部楼层
围观啊 话说牛奶大换头像了呢

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-1-5 20:56:40 |显示全部楼层
七海の游风 发表于 2012-1-5 17:59
围观啊 话说牛奶大换头像了呢

新年新头像啊

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-1-5 20:57:41 |显示全部楼层
5231251 发表于 2012-1-5 12:16

TCAX要升级到最新版才能正常使用...

正式会员

妖木

Rank: 4

发表于 2012-1-5 20:58:31 |显示全部楼层
5231251 发表于 2012-1-5 12:16

大神……求SAI大个人学习文件夹……你懂的= =

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-1-5 21:20:25 |显示全部楼层
lijingjie 发表于 2012-1-5 14:51
呵呵~差一点被tcaxPy_Main_Fake函数给蒙住了,原来是自定义函数,长的跟tcaxPy_Main函数太像了,在tcaxPy_U ...

tcaxPy_User相当于是留给用户自己定制的方法, 自由度非常大... 我这写法 (把tcaxPy_Main写进tcaxPy_User) 也是最近才想到的 233

正式会员

爱理人士

Rank: 4

发表于 2012-1-6 03:23:26 |显示全部楼层
milkyjing 发表于 2012-1-5 20:57
TCAX要升级到最新版才能正常使用...

升级过了   

正式会员

爱理人士

Rank: 4

发表于 2012-1-6 03:24:00 |显示全部楼层
mzlmcx 发表于 2012-1-5 20:58
大神……求SAI大个人学习文件夹……你懂的= =

都是坛子里的代码  你自己去看看

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-1-6 09:26:19 |显示全部楼层
5231251 发表于 2012-1-6 03:23
升级过了

用的是附件么, 有没有改过什么东西?

正式会员

爱理人士

Rank: 4

发表于 2012-1-6 13:31:35 |显示全部楼层
milkyjing 发表于 2012-1-6 09:26
用的是附件么, 有没有改过什么东西?

是啊就是下载的完整工程  什么都没有改动......

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-1-6 13:49:12 |显示全部楼层
5231251 发表于 2012-1-6 13:31
是啊就是下载的完整工程  什么都没有改动......


还真神奇了...

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

print(lineNum)
Pause()

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


正式会员

爱理人士

Rank: 4

发表于 2012-1-7 00:23:16 |显示全部楼层
milkyjing 发表于 2012-1-6 13:49
还真神奇了...

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

109.jpg


1090.jpg


Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-1-7 00:28:56 |显示全部楼层
5231251 发表于 2012-1-7 00:23

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

正式会员

爱理人士

Rank: 4

发表于 2012-1-7 12:26:44 |显示全部楼层
milkyjing 发表于 2012-1-7 00:28
109, 110行各加4个空格....

continue.jpg


then.jpg

Rank: 5Rank: 5

发表于 2012-1-7 14:53:00 |显示全部楼层
本帖最后由 lijingjie 于 2012-1-7 15:02 编辑
5231251 发表于 2012-1-7 12:26


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

debug

debug


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

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 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行那样操作...



Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-1-7 17:54:14 |显示全部楼层
5231251 发表于 2012-1-7 12:26

删除早期版本(直接删除文件夹即可), 然后执行新版本中的assoc.exe, 对着TCC文件点鼠标右键, 选择 Parse, 看看是什么情况?
您需要登录后才可以回帖 登录 | 新人加入

GitHub|TCAX 主页

GMT+8, 2024-3-28 17:40

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部
RealH