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

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

常用自定义函数AutoTags及其变种的介绍 [复制链接]

Rank: 4

跳转到指定楼层
楼主
发表于 2016-2-8 10:53:37 |只看该作者 |倒序浏览
AutoTags函数用于在持续时间段内循环两个(组)特效标签,如blur数值来回变化,造成闪烁效果。在很多脚本中都很常见。想要使用这个函数,首先需要先在code行声明该函数
  1. function AutoTags(Intervalo,Dato1,Dato2)            local RESULTADO=""     local SUERTE = 0     local CONTADOR = 0     local ARREGLO = 0                           local count = math.ceil(line.duration/Intervalo)                         ARREGLO = {Dato1,Dato2}                            for i = 1, count do               CONTADOR = i                            if Dato1 and Dato2 then                     if  CONTADOR%2 ==0 then                                    SUERTE = ARREGLO[1]                                            else                                    SUERTE = ARREGLO[2]                            end                    end                     RESULTADO = RESULTADO .."\\t(" ..(i-1)*Intervalo.. "," ..i*Intervalo.. ",\\" ..SUERTE..")"..""                      end                 return RESULTADO                                     end
复制代码

0.png
再在template中调用
原始形式的AutoTags函数用法:
AutoTags(变化用时,"标签1","标签2")(图2)

1.png


生成的效果如图3

2.png
图 3

可观察到,在整个字的持续时间内,生成了blur2->blur0->blur2的往复变化
如果要使用两组标签间的往复变化,注意应额外使用一个\,如AutoTags(500,"blur2\\fs50","blur0\\fs30").
原始形式的AutoTags介绍到这里。
下面介绍几种由不同需求产生的变种AutoTags
变种1
  1. function AutoTags1(Intervalo,Dato1,Dato2,Pause)  local RESULTADO=""  local SUERTE = 0  local CONTADOR = 0  local ARREGLO = 0  local count = math.ceil(line.duration/(Intervalo+Pause))  ARREGLO = {Dato1,Dato2}  for i = 1, count do          CONTADOR = i          if Dato1 and Dato2 then                  if  CONTADOR%2 ==0 then                  SUERTE = ARREGLO[1]                  else                  SUERTE = ARREGLO[2]                  end          end          RESULTADO = RESULTADO .."\\t(" ..(i-1)*(Intervalo+Pause).. "," ..i*Intervalo+Pause*(i-1).. ",\\" ..SUERTE..")"..""  end  return RESULTADO  end
复制代码

4.png 用于实现带有暂停时间的往复变化效果
多出的第四个参数Pause为暂停时间(ms)
AutoTags1(变化用时,"标签1","标签2",暂停时间)
变种2
  1. function AutoTags2(Intervalo,Dato1,Dato2,Delay)            local RESULTADO=""     local SUERTE = 0     local CONTADOR = 0      local ARREGLO = Layer                            local count = math.ceil(line.duration/Intervalo)                                         ARREGLO = {Dato1,Dato2}                                          for i = 1, count do               CONTADOR = i                                            if Dato1 and Dato2 then                                             if  CONTADOR%2 ==0 then                                                                    SUERTE = ARREGLO[1]                                            else                                                                    SUERTE = ARREGLO[2]                                            end                            end                                                 RESULTADO = RESULTADO .."\\t(" ..(i-1)*Intervalo+Delay.. "," ..i*Intervalo+Delay.. ",\\" ..SUERTE.. ")"..""                                  end                              return RESULTADO                                             end
复制代码
用于实现带有延迟(相对于行开始时间延后)的往复变化效果
5.png 例如,需要从行开始1s后才需要变化效果
AutoTags2(500,"标签1","标签2",1000)
变种3
  1. function AutoTags3(Intervalo1,Intervalo2,Dato1,Dato2)  local RESULTADO=""                 local SUERTE = 0                 local CONTADOR = 0                 local ARREGLO = 0                               local count = 2*math.ceil(line.duration/(Intervalo1+Intervalo2))            local d=math.ceil((Intervalo2-Intervalo1)/count)  local t={}  ARREGLO = {Dato1,Dato2}                                                      for i = 1, count do                                   CONTADOR = i  t[1]=0  t[i+1]=t[i]+Intervalo1+(i-1)*d  if Dato1 and Dato2 then            if  CONTADOR%2 ==0 then                                                                                        SUERTE = ARREGLO[1]            else                                                                                        SUERTE = ARREGLO[2]                                                        end            end                                                             RESULTADO = RESULTADO .."\\t(" ..t[i].. "," ..t[i+1].. ",\\" ..SUERTE..")"..""                                              end                                          return RESULTADO                                                         end
复制代码
等差数列型AutoTags(变化用时递增或递减)
6.png
递减效果类似炸弹定时器,越来越急促
递增效果则表示变化速度越来越缓慢
AutoTags3(第一次变化用时,最终变化用时,"标签1","标签2")
第一次变化用时>最终变化用时,为递减
最终变化用时>第一次变化用时,为递增

ASS文件放在附件了
AutoTags.zip (2.11 KB, 下载次数: 2854)



暂时就想到这么几种,等比数列,两组时间交替变化也是不错的思路,欢迎大家补充
新年第一帖,祝大家新春快乐


5

查看全部评分

正式会员

御坂、凛

Rank: 4

沙发
发表于 2016-2-9 14:40:29 |只看该作者
图像解释好形象,谢谢~~
(努力理解函数中...)

Rank: 4

板凳
发表于 2016-5-21 13:19:22 |只看该作者
所有的经验教训都告诉我们说,数学真重要啊

Rank: 4

地板
发表于 2016-7-27 23:33:43 |只看该作者
我特效目前卡一个地方 随机数再每次k的地方都会重新随机一次 我想让随机数获取后使用多次 发现貌似楼主的函数可以帮我 但是百度不到这个函数的教程啊

Rank: 4

5#
发表于 2016-8-6 20:07:27 |只看该作者
菌泠 发表于 2016-7-27 23:33
我特效目前卡一个地方 随机数再每次k的地方都会重新随机一次 我想让随机数获取后使用多次 发现貌似楼主的函 ...

需要理解code、template及修饰语的概念
在code行定义随机数
如果是code once
则整个自动化执行过程中产生一次随机
code line
则针对每一行产生一次随机
code syl
针对每个音节(也就是每个k)产生一次随机

Rank: 4

6#
发表于 2016-9-1 18:00:18 |只看该作者
qwe7989199 发表于 2016-8-6 20:07
需要理解code、template及修饰语的概念
在code行定义随机数
如果是code once

大触居然会回我啊 你这意思我懂了  在template syl里调用code line的随机数 就可以达到一行出现一个随机数使用多次的效果果然自学这东西 各种细节不懂啊

Rank: 4

7#
发表于 2016-9-4 10:48:58 |只看该作者
菌泠 发表于 2016-9-1 18:00
大触居然会回我啊 你这意思我懂了  在template syl里调用code line的随机数 就可以达到一 ...

这种东西手册都有介绍,这部分早就汉化过了,可以收藏一下方便以后自己查阅。自学什么的,其实大部分人都是自学过来的吧.........http://aegi.vmoe.info/docs/3.2/A ... e_lines_and_blocks/

Rank: 4

8#
发表于 2016-9-24 15:35:34 |只看该作者
qwe7989199 发表于 2016-9-4 10:48
这种东西手册都有介绍,这部分早就汉化过了,可以收藏一下方便以后自己查阅。自学什么的,其实大部分人都 ...

光aegisub就够我受了 我就玩下这个就好了 感谢dalao指点迷津 把code这一块弄懂 再研究下mod 有需要图形可以自己绘图 aegisub就算lv.max了吧 dalao的帖子和指点的地方我已经可以实际应用了 b站id 菌泠 有兴趣看看我成长呗

Rank: 4

9#
发表于 2016-9-24 15:55:16 |只看该作者
qwe7989199 发表于 2016-9-4 10:48
这种东西手册都有介绍,这部分早就汉化过了,可以收藏一下方便以后自己查阅。自学什么的,其实大部分人都 ...

对了 还问一个困扰我很久的问题 一行代码中 org只能指定一次 那么 我记得有一部动漫op 中二病也要谈恋爱  中 有一个字幕组做的字幕特效就有一段一边移动一边旋转 做出了滚动的效果 大致就是移动中 进行了旋转  而且旋转原点一直绑定了字的中心位置  这个效果光用aegisub做出来么

Rank: 4

10#
发表于 2016-9-24 17:02:16 |只看该作者
菌泠 发表于 2016-9-24 15:55
对了 还问一个困扰我很久的问题 一行代码中 org只能指定一次 那么 我记得有一部动漫op 中二病也要谈恋爱  ...

这种?     {\move(100,100,800,100)\t(\frz-1800)\an5}滚

当然有可能an5给出的中心位置不是严格的文字中心,有些字体会出现偏心旋转

Rank: 4

11#
发表于 2016-9-26 09:49:08 |只看该作者
qwe7989199 发表于 2016-9-24 17:02
这种?     {\move(100,100,800,100)\t(\frz-1800)\an5}滚

当然有可能an5给出的中心位置不是严格的文字 ...

http://www.bilibili.com/video/av4523806/index_1.html 这个 好像又不是这个 1分钟后面的直线旋转移动居然没有受到圆心的干扰 虽然的记得的是全程旋转移动的 但是没找到

Rank: 4

12#
发表于 2016-9-26 19:47:31 |只看该作者
菌泠 发表于 2016-9-26 09:49
http://www.bilibili.com/video/av4523806/index_1.html 这个 好像又不是这个 1分钟后面的直线旋转移动居 ...

和我上面给的没有区别........圆心本来就在字上,不用手动调整

Rank: 4

13#
发表于 2016-9-26 23:47:16 |只看该作者
qwe7989199 发表于 2016-9-26 19:47
和我上面给的没有区别........圆心本来就在字上,不用手动调整

我一直以为org属性是一个锁定值 原来不指定 就是固定字的an位置啊   喵的 一直困扰的问题居然这么简单

Rank: 4

14#
发表于 2016-9-29 16:27:39 |只看该作者
看到那么多函数  头都大了

Rank: 4

15#
发表于 2017-8-13 19:47:57 |只看该作者
這寫成python的oo 或許比較容易看得清楚他在做啥
其中下面的代碼中
line_dur對應到aegisub的line.duration
  1. import math

  2. class autotag:
  3.         def __init__(self, intervalo1=0, intervalo2=0, dato1="",
  4.                                 dato2="", pause=0, delay=0, line_dur=0):
  5.                
  6.                 self.intervalo1 = intervalo1
  7.                 self.intervalo2 = intervalo2
  8.                 self.dato1 = dato1
  9.                 self.dato2 = dato2
  10.                 self.pause = pause
  11.                 self.delay = delay
  12.                
  13.                 self.resultado = ""
  14.                 self.suerte = ""
  15.                 self.contador = 0
  16.                 self.line_dur = line_dur
  17.        
  18.         def autotags(self):
  19.                 count = math.ceil(self.line_dur / self.intervalo1)
  20.                
  21.                 for i in range(count):
  22.                         if i % 2 == 0:
  23.                                 self.suerte = self.dato1
  24.                         else:
  25.                                 self.suerte = self.dato2
  26.                        
  27.                         self.resultado += "\\t({0}, {1}, {2})".format(i*self.intervalo1, (i+1)*self.intervalo1, self.suerte)
  28.                
  29.                 return self.resultado
  30.        
  31.         def autotags1(self):
  32.                 count = math.ceil(self.line_dur / (self.intervalo1+self.pause))
  33.                
  34.                 for i in range(count):
  35.                         if i % 2 == 0:
  36.                                 self.suerte = self.dato1
  37.                         else:
  38.                                 self.suerte = self.dato2
  39.                        
  40.                         self.resultado += "\\t({0}, {1}, {2})".format(i*(self.intervalo1+self.pause), (i+1)*self.intervalo1+i*self.pause, self.suerte)
  41.                
  42.                 return self.resultado
  43.        
  44.         def autotags2(self):
  45.                 count = math.ceil(self.line_dur / self.intervalo1)
  46.                
  47.                 for i in range(count):
  48.                         if i % 2 == 0:
  49.                                 self.suerte = self.dato1
  50.                         else:
  51.                                 self.suerte = self.dato2
  52.                        
  53.                         self.resultado += "\\t({0}, {1}, {2})".format(i*self.intervalo1+self.delay, (i+1)*self.intervalo1+self.delay, self.suerte)
  54.                
  55.                 return self.resultado
  56.        
  57.         def autotags3(self):
  58.                 count = 2 * math.ceil(self.line_dur / (self.intervalo1 + self.intervalo2))
  59.                 d = math.ceil((self.intervalo2 - self.intervalo1) / count)
  60.                 t = [0]
  61.                
  62.                 for i in range(count):
  63.                        
  64.                         t.append(t[i] + self.intervalo1 + i * d)
  65.                        
  66.                         if i % 2 == 0:
  67.                                 self.suerte = self.dato1
  68.                         else:
  69.                                 self.suerte = self.dato2
  70.                        
  71.                         self.resultado += "\\t({0}, {1}, {2})".format(t[i], t[i+1], self.suerte)
  72.                
  73.                 return self.resultado
复制代码

Rank: 4

16#
发表于 2018-8-22 10:19:27 |只看该作者
好帖子!学习到了
您需要登录后才可以回帖 登录 | 新人加入

GitHub|TCAX 主页

GMT+8, 2024-11-23 20:13

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部
RealH