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

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

[ASS特效教程入门系列] 三. 曲线轨迹的简单应用及逐帧特效 [复制链接]

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

跳转到指定楼层
楼主
发表于 2011-11-1 20:49:46 |只看该作者 |正序浏览
说明

本系列教程旨在更好的引导大家使用TCAX制作一些特效, 有空我会逐渐补上我所了解的一些特效的制作.
为加深大家对教程代码的理解, 附上了可以直接执行的完整工程, 建议下载并实际操作一下.
  1. from tcaxPy import *

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

  3.     ASS_BUF  = []        # 保存ASS特效
  4.     TCAS_BUF = []        # 保存TCAS特效

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

  6.     ts = _start + _elapk - 20       # 效果开始时间
  7.     _Fs = GetVal(val_FontSize)      # 字体大小
  8.     EFT1 = alpha1(HexToDec('AA')) + alpha3(HexToDec('AA')) + color1('FFFFFF') + \
  9.             bord(5) + blur(5) + t(0, 100, bord(3) + blur(3)) + fad(0, 200)
  10.     EFT2 = alpha1(HexToDec('AA')) + alpha3(HexToDec('00')) + color1('FFFFFF') + color3('FFFFFF') + \
  11.             bord(3) + blur(3) + t(0, 100, bord(1) + blur(1) + alpha3(HexToDec('44'))) + fad(0, 200)
  12.     num = 60    # 曲线上点的个数
  13.     xs = _x + randint(-100, 100)    # 开始点
  14.     ys = _y + randint(-60, 20)
  15.     xc1 = xs + randint(-50, 50)     # 控制点1
  16.     yc1 = ys + randint(-50, 50)
  17.     xc2 = xc1 + randint(-40, 40)    # 控制点2
  18.     yc2 = yc1 + randint(-40, 40)
  19.     xe = _x     # 结束点
  20.     ye = _y
  21.     points = Bezier3(num, xs, ys, xe, ye, xc1, yc1, xc2, yc2)   # 3阶贝塞尔曲线, 控制点的生成是重点以及难点
  22.     for i in range(num):
  23.         POS = pos(points[i][0], points[i][1])   # 获取曲线上点坐标
  24.         EFT = POS + EFT1 + color3('5A3AFF')
  25.         ass_main(ASS_BUF, SubL(ts + i, ts + i + 30, 15, Pix_Style), EFT, PixPt())
  26.         EFT = POS + EFT2
  27.         ass_main(ASS_BUF, SubL(ts + i, ts + i + 30, 15, Pix_Style), EFT, PixPt())

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

  29.     return (ASS_BUF, TCAS_BUF)
复制代码
后记

在理解了上述代码的基础上, 可以进一步学习具体的使用方法.
saiyaku写了不少具体效果, 可以对着预览视频, 找到相应的脚本.

视频 http://www.tcax.org/forum.php?mod=viewthread&tid=44
代码 http://www.tcax.org/forum.php?mo ... typeid&typeid=3


p.s. 如有疑问, 请直接跟帖...


test_bezier.zip

3.26 KB, 下载次数: 5581

Rank: 6Rank: 6

84#
发表于 2016-1-26 11:24:28 |只看该作者
码一个 回家看

Rank: 6Rank: 6

83#
发表于 2016-1-26 11:23:53 |只看该作者
码一个 滚回家看

Moderator

疯子

Rank: 5Rank: 5

82#
发表于 2013-2-8 23:05:58 |只看该作者
爱雪音MiKu 发表于 2013-2-8 21:17
呜咕。。V。。偶知道。。原来是这个原理。。。谢谢大大。。新年快乐

新年快乐,你理解了就行了~

Rank: 4

81#
发表于 2013-2-8 21:17:02 |只看该作者
渣渣疯子 发表于 2013-2-8 21:02
我不知道你想要什么样的效果。。。说个大概吧,一条曲线的点数是num,你想要的时间是_BT+_SK到_BT+_SK+(_ ...

呜咕。。V。。偶知道。。原来是这个原理。。。谢谢大大。。新年快乐

Moderator

疯子

Rank: 5Rank: 5

80#
发表于 2013-2-8 21:02:36 |只看该作者
爱雪音MiKu 发表于 2013-2-8 20:35
呜咕。。如果要让整条线设置成0.7*_KT的时间呢。。怎么设置呀0.0

我不知道你想要什么样的效果。。。说个大概吧,一条曲线的点数是num,你想要的时间是_BT+_SK到_BT+_SK+(_KT*0.7)这个时间段,配合数列i,把这些点均摊在这个时间段内就好了。。。能明白么?具体时间点我还真不知道你想怎么弄,不过(_KT * 0.7)/num我觉得应该有用吧?

Rank: 4

79#
发表于 2013-2-8 20:35:11 |只看该作者
渣渣疯子 发表于 2013-2-8 20:02
你这样试验后是不是会拖很长一条线?你这样就等于让每个点存在了0.7 * _KT的时间,如果这是 ...

呜咕。。如果要让整条线设置成0.7*_KT的时间呢。。怎么设置呀0.0

Rank: 4

78#
发表于 2013-2-8 20:19:09 |只看该作者
渣渣疯子 发表于 2013-2-8 20:02
你这样试验后是不是会拖很长一条线?你这样就等于让每个点存在了0.7 * _KT的时间,如果这是 ...

呜咕。。偶是这样的。。在这里偶设置的是0.7*_KT的时候字体会边框高亮的。。所以。。曲线正好到字体里

Moderator

疯子

Rank: 5Rank: 5

77#
发表于 2013-2-8 20:02:55 |只看该作者
爱雪音MiKu 发表于 2013-2-8 15:56
呜咕。。第一个曲线几乎是透明的。。生成后就消失了0.0?
第二个曲线有了而且慢慢消失的

你这样试验后是不是会拖很长一条线?你这样就等于让每个点存在了0.7 * _KT的时间,如果这是你需要的效果,你就这样写,如果不是,就继续改吧

Rank: 4

76#
发表于 2013-2-8 15:56:52 |只看该作者
渣渣疯子 发表于 2013-2-8 15:24
你的设定是一个点,你要想的是这个点出现多久,而不是一条线出现多久,(_BT+_SK+i,_BT+_SK+ ...

呜咕。。第一个曲线几乎是透明的。。生成后就消失了0.0?
第二个曲线有了而且慢慢消失的

那么偶应该这样0.0(_BT+_SK +i ,_BT+_SK+i+(0.7 * _KT))

Moderator

疯子

Rank: 5Rank: 5

75#
发表于 2013-2-8 15:24:56 |只看该作者
爱雪音MiKu 发表于 2013-2-8 12:29
呜咕。。可还是不在时间内到_X,_Y。。(T.T)

你的设定是一个点,你要想的是这个点出现多久,而不是一条线出现多久,(_BT+_SK+i,_BT+_SK+i+1)你可以试试这样,也可以试试(_BT+_SK+i,_BT+_SK+i+30)先看看这两个的区别,再想想怎么设置一个点的时间?

Rank: 4

74#
发表于 2013-2-8 12:29:03 |只看该作者
爱雪音MiKu 发表于 2013-2-8 12:26
呜咕。。偶明白了。。时间旁边的1是设定粒子的数量吧。。。这里要和粒子数一样才是整条线吧0.0? ...

呜咕。。可还是不在时间内到_X,_Y。。(T.T)

Rank: 4

73#
发表于 2013-2-8 12:26:32 |只看该作者
渣渣疯子 发表于 2013-2-8 11:01
噗。。。你这时间点设定这么久,它当然会拉着一条长长的线了,你这个时间点设定的是单个粒子的时间,而不 ...

呜咕。。偶明白了。。时间旁边的1是设定粒子的数量吧。。。这里要和粒子数一样才是整条线吧0.0?

Rank: 4

72#
发表于 2013-2-8 12:23:08 |只看该作者
渣渣疯子 发表于 2013-2-8 11:01
噗。。。你这时间点设定这么久,它当然会拉着一条长长的线了,你这个时间点设定的是单个粒子的时间,而不 ...

呜咕。。。(_BT+_SK  + i ,_BT+_SK+(0.7 * _KT)     这样不是开始时间+K值开始的时间,到开始的时间+K值开始的时间+K值的7/10的时间0.0?。。。。呜咕。。偶想不明白(T.T)

Rank: 4

71#
发表于 2013-2-8 12:04:33 |只看该作者
渣渣疯子 发表于 2013-2-8 11:01
噗。。。你这时间点设定这么久,它当然会拉着一条长长的线了,你这个时间点设定的是单个粒子的时间,而不 ...

呜咕。。偶想想。。把时间去掉。。然后在循环外加一个时间0.0?

Moderator

疯子

Rank: 5Rank: 5

70#
发表于 2013-2-8 11:01:30 |只看该作者
爱雪音MiKu 发表于 2013-2-7 19:17
呜咕。。求问0.0为什么曲线无法在偶这个设定的时间内呢0.0?。。而且曲线移动速度好快。。一下子就到_X,_Y ...

噗。。。你这时间点设定这么久,它当然会拉着一条长长的线了,你这个时间点设定的是单个粒子的时间,而不是整条曲线的时间,只不过利用别的变量比如说i来改变每个粒子的时间,你再考虑考虑时间点的具体设定?

Rank: 4

69#
发表于 2013-2-7 19:17:52 |只看该作者
呜咕。。求问0.0
  1. ass_main(ASS_BUF, SubL(_BT-15,_BT+_SK),color1("FF5150")+fad(100,0)+pos(_X,_Y),_TXT)
  2.         ass_main(ASS_BUF, SubL(_BT+_SK,_BT+_SK+(0.6 * _KT)),pos(_X,_Y)+blur(2)+color1("46FFDD"),_TXT)
  3.         ass_main(ASS_BUF, SubL(_BT+_SK+(0.6 * _KT),_BT+_SK+(0.7 * _KT)),pos(_X,_Y)+blur(7)+bord(5)+color1("FFFFFF"),_TXT)
  4.         ass_main(ASS_BUF, SubL(_BT+_SK+(0.7 * _KT),_ET),pos(_X,_Y)+bord(1.5)+blur(1)+color1("FE5B85")+alpha1(255),_TXT)
  5.    
  6.     # 字体大小
  7.         EFT1 = alpha1(HexToDec('AA')) + alpha3(HexToDec('00')) + color1('FFFFFF') + color3('FFFFFF') + \
  8.             bord(3) + blur(3) + t(0, 100, bord(1) + blur(1) + alpha3(HexToDec('44')))  + fad(0,250)
  9.         EFT2 = alpha1(HexToDec('AA')) + alpha3(HexToDec('00')) + color1('FFFFFF') + color3('FFFFFF') + \
  10.             bord(3) + blur(3) + t(0, 100, bord(1) + blur(1) + alpha3(HexToDec('44')))  + fad(0,250)
  11.         for k in range(4):
  12.              num = 35    # 曲线上点的个数
  13.              xs = _X + randint(-42, 36)    # 开始点
  14.              ys = _Y + randint(-40, 20)
  15.              xc1 = xs + randint(-30, 50)     # 控制点1
  16.              yc1 = ys + randint(-35, 50)
  17.              xc2 = xc1 + randint(-40, 40)    # 控制点2
  18.              yc2 = yc1 + randint(-40, 40)
  19.              xe = _X     # 结束点
  20.              ye = _Y
  21.             
  22.              points1 = Bezier3(num, xs, ys, xe, ye, xc1, yc1, xc2, yc2)   # 3阶贝塞尔曲线, 控制点的生成是重点以及难点
  23.             
  24.              for i in range(num):
  25.                   POS1 = pos(points1[i][0], points1[i][1])
  26.                   # 获取曲线上点坐标
  27.                   EFT = POS1  + EFT1 + color3('68DDF1')
  28.                   ass_main(ASS_BUF, SubL(_BT+_SK  + i ,_BT+_SK+(0.7 * _KT) , 1, Pix_Style), EFT, PixPt())
  29.                   EFT = POS1 + EFT2
  30.                   ass_main(ASS_BUF, SubL(_BT+_SK  + i ,_BT+_SK+(0.7 * _KT) , 1, Pix_Style), EFT, PixPt())
复制代码
为什么曲线无法在偶这个设定的时间内呢0.0?。。而且曲线移动速度好快。。一下子就到_X,_Y了。。然后就拉着长长的一条线就定在这里了0.0?。。

Rank: 4

68#
发表于 2013-2-3 13:49:33 |只看该作者
渣渣疯子 发表于 2013-2-3 13:13
生成的东西看不到=。=不知道为什么,可能复制过程中删掉了什么。。。与其找出来不如重新写一份...不过我 ...

呜咕。。明白的说。。谢谢

Moderator

疯子

Rank: 5Rank: 5

67#
发表于 2013-2-3 13:13:55 |只看该作者
爱雪音MiKu 发表于 2013-2-3 07:42
嘎哦。。0.0。。那么测试的代码给偶
  1. from tcaxPy import *


  2. def tcaxPy_Init():
  3.     global _FontFileName          # frame duration, in millisecond
  4.     global _FD                  
  5.     global _Fs
  6.     global _Length
  7.     global _Bd
  8.     global _Br
  9.     global _FaceID
  10.     global _Font
  11.     _FontFileName = GetVal(val_FontFileName)
  12.     _FD = 1000 / GetVal(val_FXFPS)
  13.     _Fs = GetVal(val_FontSize)
  14.     _Length = GetVal(val_TextLength)
  15.     _Bd = GetVal(val_Bord)
  16.     _Br = GetVal(val_Blur)
  17.     _FaceID = GetVal(val_FaceID)
  18.     _Font = InitFont(_FontFileName, _FaceID, _Fs, GetVal(val_Spacing), GetVal(val_SpaceScale), 0xFFFFFF, 2, False)

  19. def fr(x):

  20.     X = randint(-x,x)

  21.     return frx(X)+fry(X)+frz(X)

  22. def tcaxPy_Main(_i, _j, _n, _BT, _ET, _SK, _KT, _X, _Y, _A, _TXT):


  23.     ASS_BUF  = []        # 保存ASS特效
  24.     TCAS_BUF = []        # 保存TCAS特效

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

  26.     ts = _BT + _SK - 20       # 效果开始时间
  27.     _Fs = GetVal(val_FontSize)      # 字体大小
  28.     for k in range(2):
  29.          num = 60    # 曲线上点的个数
  30.          xs = _X     # 开始点
  31.          ys = _Y - 30
  32.          xc1 = _X - 30  # 控制点1
  33.          yc1 = _Y
  34.          xc2 = _X    # 控制点2
  35.          yc2 = _Y + 30
  36.          xe = _X     # 结束点
  37.          ye = _Y
  38.          num = 60
  39.          ixs = _X     # 开始点
  40.          iys = _Y + 30
  41.          ixc1 = _X + 30  # 控制点1
  42.          iyc1 = _Y
  43.          ixc2 = _X    # 控制点2
  44.          iyc2 = _Y - 30
  45.          ixe = _X     # 结束点
  46.          iye = _Y
  47.          points1 = Bezier3(num, xs, ys, xe, ye, xc1, yc1, xc2, yc2)   # 3阶贝塞尔曲线, 控制点的生成是重点以及难点
  48.          points2 = Bezier3(num,ixs, iys, ixe, iye, ixc1, iyc1, ixc2, iyc2)
  49.          for i in range(num):
  50.               POS1 = pos(points1[i][0], points1[i][1])
  51.               POS2 = pos(points2[i][0], points2[i][1])
  52.               EFT1 = POS1 + color3('5A3AFF')+bord(2)
  53.               ass_main(ASS_BUF, SubL(ts + i, ts + i + 30, 15, Pix_Style), EFT1, PixPt())
  54.               EFT2 = POS2 +bord(2)
  55.               ass_main(ASS_BUF, SubL(ts + i, ts + i + 30, 15, Pix_Style), EFT2, PixPt())

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

  57.     return (ASS_BUF, TCAS_BUF)
复制代码
生成的东西看不到=。=不知道为什么,可能复制过程中删掉了什么。。。与其找出来不如重新写一份...不过我懒得写了...你可以对比下POS和EFT的问题。别的应该也没什么帮助了

Rank: 4

66#
发表于 2013-2-3 07:42:57 |只看该作者
渣渣疯子 发表于 2013-2-2 22:14
已经好了么=。=。。。我这里测试生成的东西看不到粒子点。。。这次换我郁闷了 ...

嘎哦。。0.0。。那么测试的代码给偶
您需要登录后才可以回帖 登录 | 新人加入

GitHub|TCAX 主页

GMT+8, 2024-5-3 07:32

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部
RealH