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

 找回密码
 新人加入
查看: 24793|回复: 37

TCAS特效使用教程 (编辑中99%) [复制链接]

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-1-19 14:38:47 |显示全部楼层
TCAS特效使用教程


阅读指南

阅读本文之前, 请先了解TCAX的一些基本用法, 并能够用Python编写自己的TCAX特效脚本.
本文只对TCAS的基本用法作个简单的介绍. 其中前三章是介绍性文字, 后三章是重点.
关于本教程的疑问, 想法, 讨论等, 请移步 TCAS特效使用教程 讨论专用帖


内容简介

本文会简单地回答如下问题

    1. TCAS是什么
      *1.1 TCAS的由来
        1.2 TCAS简单介绍
        1.3 TCAS文件格式说明
    2. 与ASS的横向比较
        2.1 综合比较
        2.2 优点
        2.3 缺点
    3. 学习TCAS的价值
        3.1 哪些效果用TCAS制作更加方便高效
        3.2 有哪些功能模块的支持
        3.3 实例
    4. 如何使用TCAS
        4.1 如何生成TCAS文件
        4.2 如何预览/压制TCAS特效
        4.3 其他一些辅助工具
    5. 如何编写TCAS特效
        5.1 什么是PIX
        5.2 如何得到PIX
        5.3 TCAS特效相关函数参考
        5.4 实例教程
    6. 重要思想方法及重要函数介绍
        6.1 图像处理简介
        6.2 PIX的坐标定位
        6.3 CombinePixs()函数及BIG_PIX介绍
        6.4 BilinearFilter()函数及动画平滑
        6.5 PixTexture(), PixMask()函数简介
        6.6 其他一些函数



1

查看全部评分

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-1-19 17:36:53 |显示全部楼层

1. TCAS是什么

*1.1 TCAS的由来

先说说我当初开发TCAS(以前称为TCS)的动机吧. 在掌握了使用ASS制作像素级特效后, 我发现生成的ASS文件体积过大, 渲染也相当慢, 对于一些更复杂的效果, 用ASS来做基本不现实. 当时我就意识到制作像素级特效, ASS有相当大的信息熵冗余(可以简单理解为, 我们可以使用更小的文件来保存相同量的信息), 于是我就想, 能不能专门设计一种文件格式, 用来保存像素级特效. 唯一一个约束条件就是它能够与ASS特效并存(两者可以一起使用), 也就是说, TCS是作为ASS的一个补充而开发的, 目标是为了减少信息冗余.

2010年3月初, 第一个支持TCS特效的程序, TCSub 1.9.1.8发布了, 不过我并没有公开TCS相关的接口, 主要是由于当时的TCS还相当的不成熟, 随着开发的进行, 改动可能会很大. 但我也逐渐认识到TCS不仅可以与ASS混用, 而且也可以用来独立地制作一些特效. 一个具有里程碑意义的特效是11eyes_op, 该例子之后也一直被用作测试用例.

在停滞了一段时间后, 大约是2010年9月份, 我发布了tcx demo版, 该版本的TCS得到了一定程度的升级, 差不多达到了alpha测试版水平, 我也公布了一部分接口(在原来的ASS特效研习社论坛).

在停滞半年多之后, 我重启了Teco项目(主产品为tcx), 并更名为RIXE项目(主产品为TCAX), TCS也得到了几个重要改进, 并正式更名为TCAS. 此时的TCAS相对而言更加的成熟稳定. 在渲染效率上也远超ASS, 基本上实现了实时预览. 我也用TCAS完成了几个实际特效. 在此基础上我开始重新评估TCAS的价值. (见下文)


1.2 TCAS简单介绍

TCAS是TCAX所支持的两种特效形式之一(另外一种是大家所熟知的ASS). 目前只有TCAX这一款程序支持TCAS特效, 但不管从理论上还是实际操作上来说, TCAS特效都可以被别的程序所支持.

站在最高层面来讲, TCAS是一个非线性位图动画系统, 相对的ASS则是一个非线性矢量图动画系统. TCAS文件是一种二进制文件, 保存了海量的动态离散像素点, 称之为DIP, 即每个像素点都可以具有独立的生存时间, 层, 坐标, 以及像素值等信息. 在生成TCAS文件的时候, 我们把这些信息写入到文件中. 在渲染阶段, TCAS文件渲染模块(如tcasFilter)会解析这些信息, 生成一帧一帧相同分辨率的无损位图(VSFilter的原理也是如此, 不过它解析的是ASS等格式的文件)


1.3 TCAS文件格式说明

文档比较长时间没有更新了, 仅可作为参考

TCAS File Format Specification



Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-1-19 20:31:25 |显示全部楼层

2. 与ASS的横向比较

2.1 综合比较

    TCAS是一个非线性位图动画系统, ASS是一个非线性矢量图动画系统.
    TCAS文件是一种二进制文件, ASS文件是一种结构化的文本文件
    TCAS的操作对象是PIX(一种内存位图), ASS的操作对象是矢量图形(文字, ASS绘图等)
    TCAS特效的制作用到各种图像操作函数(滤镜), 图像特效算法, ASS特效的制作则用到各种ASS特效代码, 图形学知识
    TCAS特效的预览需要tcasFilter, ASS特效的预览需要VSFilter.
    TCAS文件体积更大, 生成效率更低, 渲染效率更高, ASS文件体积较小, 生成效率较高, 渲染效率比较低 (一般情况下)
    TCAS特效可以转换成像素级ASS特效, ASS特效可以通过cairo模块转成TCAS特效 (理论上)


2.2 优点

    渲染效率更高
    可以制作更复杂的特效
    文字与图片都同等作为PIX来操作
    纹理, 遮罩等操作代价非常低


2.3 缺点

    文件体积比较大
    生成效率通常不如ASS特效
    入门比ASS特效要难一些



Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-1-22 21:50:51 |显示全部楼层

3. 学习TCAS的价值

3.1 哪些效果用TCAS制作更加方便高效

纹理, 遮罩, 字体效果, 滤镜特效, 静态效果等


3.2 有哪些功能模块的支持

核心: tcaxLib.pyd
拓展: pixStone.pyd
加强: cairo, magick, tcVideo, tcAudio, etc. (部分尚在开发中)


3.3 实例

HorizonII_OP_proj.rar
AW_OP2_proj.rar
Gundam_Seed_OP3.rar
Accel_World_OP_FX.rar
Gundam_Seed_OP2.rar
Another_OP.rar
Gundam_Seed_OP.rar
working_II_OP.rar
horizon_OP.rar
working_II_op.rar
11eyes_op_renewal.rar
Nurarihyon_OP.rar
munto_ed_shanzhai.rar



Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-1-23 19:10:31 |显示全部楼层

4. 如何使用TCAS

4.1 如何生成TCAS文件

如果使用tcaxPy_Main()函数, 则会自动生成一个TCAS文件. 或者也可以在tcaxPy_User()函数中使用tcaxLib.pyd提供的一些TCAS文件操作函数来创建TCAS文件. 创建TCAS文件的代码模板如下, 主要利用三个函数CreateTcasFile(), WriteTcasFile(), 以及FinTcasFile():
  1. from tcaxPy import *

  2. def tcaxPy_User():
  3.     # 固定的TCAS文件创建方式
  4.     file_name = GetVal(val_OutFile) + '.tcas'
  5.     fx_width = GetVal(val_ResolutionX)
  6.     fx_height = GetVal(val_ResolutionY)
  7.     fx_fps = GetVal(val_FXFPS)
  8.     TCAS_FILE = CreateTcasFile(file_name, fx_width, fx_height, fx_fps)
  9.     # 往TCAS文件中写入内容
  10.     for i in range(100):
  11.         TCAS_BUF = []    # 创建一块新缓冲区
  12.         PIX = BlankPix(40, 40, MakeRGBA(255 - i, 2 * i, 0, 255))
  13.         dx = (fx_width - PIX[1][0]) / 2 - PIX[0][0]
  14.         dy = (fx_height - PIX[1][1]) / 2 - PIX[0][1]
  15.         tcas_main(TCAS_BUF, PIX, i * 1000 / fx_fps, (i + 1) * 1000 / fx_fps, dx, dy, 0)    # 往缓冲区添加内容
  16.         WriteTcasFile(TCAS_FILE, TCAS_BUF)     # write the buffer in memory to the file    # 将缓冲区中的内容写入到TCAS文件里
  17.     # 关闭TCAS文件
  18.     FinTcasFile(TCAS_FILE)
复制代码
附上完整工程:    test_tcas_file.zip (1.6 KB, 下载次数: 3510)

需要注意的一点是, 一个TCAS_BUF的容量不是无限大的, 为了提高内存使用效率, 我们需要在适当的时候调用WriteTcasFile()函数将TCAS_BUF的内容写入到文件中, 之后重新定义TCAS_BUF = []以便清空原内容. 一般几M到几十M的TCAS_BUF是合理的.

ASS文件的创建也是类似的, 附上完整工程作为参考:    test_ass_file.rar (1.24 KB, 下载次数: 3424)

不管是使用tcaxPy_Main()函数或是tcaxPy_User()函数都有其各自方便的地方, 所以两种方法都会被用到.


4.2 如何预览/压制TCAS特效

请参考: 后期用TCAS教程


4.3 其他一些辅助工具

辅助工具都位于TCAX程序根目录的tools文件夹下

timeShift.exe 主要用于平移TCAS文件的时间
parser.exe 预渲染TCAS文件, 得到一个新的_parsed.tcas文件, 除非原TCAS文件非常大(如, 过300MB), 否则用不到
merger.exe 预渲染并合并两个TCAS文件



Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-1-23 19:49:26 |显示全部楼层

5. 如何编写TCAS特效

5.1 什么是PIX

从上面的例子中, 我们看出TCAS特效离不开一种结构, PIX. 下面就来详解一下PIX.

从宏观角度来看, PIX就是一张存放在内存中的图片, 至于图片的内容, 既可以是字符, 也可以是纹理, 或者就是单纯一张普通图片. PIX是编写TCAS特效要操作的主要对象. 作个类比, 在ASS中, 我们可以对文字或者绘图代码通过特效代码施加各种特殊效果, 如"{\blur2}好", 可以给"好"这个对象增加模糊效果. 在TCAS中, 我们可以使用各种PIX操作函数来操作PIX, 如PixBlur(PIX, 2), 可以返回一个新的PIX, 如果原来的PIX是一个写有"好"字的图片, 则返回的PIX效果就相当于"{\blur2}好"

从微观角度来看, PIX就是一个Python的复合Tuple(元组)对象, 其具体结构如下:
((x, y), (width, height), (r, g, b, a, r, g, b, a, ....))
PIX[0], 即(x, y), 保存的是这个PIX的相对位置信息
PIX[1], 即(width, height), 保存的是这个PIX的宽高
PIX[2], 即(r, g, b, a, r, g, b, a, ....), 保存的是实际像素信息, 存放方式是r, g, b, a(红, 绿, 蓝, 不透明度)四个一组, 按照行存储. 像素是一个重要概念, 如果对此还不太了解, 可以参考 http://zh.wikipedia.org/zh/像素
PIX的内部细节可参考如下代码:
  1.     # 像素字特效固定代码框架 开始
  2.     PIX = TextPix(_Font, _txt)      # 获取当前文字的PIX结构
  3.     initPosX = _x - int(_a / 2 + 0.5) + PIX[0][0]        # 第一个像素的X轴坐标
  4.     initPosY = _y - int(_Fs / 2 + 0.5) + PIX[0][1]       # 第一个像素的Y轴坐标
  5.     for h in range(PIX[1][1]):                           # 开始纵向扫描
  6.         posY = initPosY + h                               # 当前像素Y轴坐标
  7.         for w in range(PIX[1][0]):                       # 开始横向扫描
  8.             posX = initPosX + w                           # 当前像素X轴坐标
  9.             idx  = 4 * (h * PIX[1][0] + w)                # 脚标
  10.             pixR = PIX[2][idx + 0]                        # 当前像素的红色分量
  11.             pixG = PIX[2][idx + 1]                        # 当前像素的绿色分量
  12.             pixB = PIX[2][idx + 2]                        # 当前像素的蓝色分量
  13.             pixA = PIX[2][idx + 3]                        # 当前像素的透明度
  14.             if pixA != 0:                                # 如果当前像素不为透明则进行如下操作
  15.                 # 增加你的效果, 注意Style使用Pix_Style
  16.                 ass_main(ASS_BUF, SubL(_start, _end, 0, Pix_Style), pos(posX, posY) + color1(FmtRGB(pixR, pixG, pixB)) + alpha1(255 - pixA), PixPt())
  17.     # 像素字特效固定代码框架 结束
复制代码
补充: 关于PIX[2]的结构, 以及idx的计算.


(图片改为 忘却の小伊 的了)

图片是由一个一个像素点构成的, 我们可以把它当做是放置于直角坐标系中的一个矩形. 如果我们固定矩形的左下角顶点为坐标原点, 则图片上的每一个像素点都对应一个整数坐标(x, y), 其中0<=x<width, 0<=y<height. 如图, 红色标示的像素点, 其坐标为(1, 2), 但我们用的是一维数组来存储这个二维图片, 并且是按照行来存储的, 也即, PIX[2]中的第0~(width-1)号元素存的是图片的第一行像素, width~(2*width - 1)号元素存的是第二行像素, 依次类推. 所以在PIX[2]中, 图片的红色点坐标可以转换为2 * 5 + 1. 之所以计算idx需要乘上4, 是因为对于一个像素点, 我们需要4个元素来分别存储它的红, 绿, 蓝, 不透明度分量.

通常我们不需要关心PIX的细节, 因为PIX的操作函数是把PIX当做一个整体来操作的, 返回的结果仍然是一个PIX.


5.2 如何得到PIX

由基本函数构造原始PIX
TextPix()函数, 可以由字符来构造PIX, 如 PIX = TextPix(Font, "你好"), 则PIX是一张包含"你好"二字的图片
ImagePix()函数, 可以读入一张png格式的图片, 如 PIX = ImagePix(abspath('test.png')), 则PIX是一张包含test.png内容的图片
BlankPix()函数, 可以构造一张纯色的图片, 如 PIX = BlankPix(width, height, MakeRGBA(255, 0, 0, 128)), 则PIX是一张红色的半透明图片
util.cairo模块的surface.get_pix()函数可以由cairo的surface对象构造PIX
util.magick模块的pmgToPix()函数可以由magick的image对象构造PIX

由PIX操作函数转换已有PIX而得
如PixBlur()等函数, 该类型函数可接受一个或多个PIX对象, 以及一些额外参数, 进行适当的变换后返回一个新的PIX对象.

自己手动构造
即, 不使用内部函数, 直接用Python脚本编写代码构造出一个满足条件的PIX对象. 需要对PIX的内部细节有较为详细的了解, 并熟悉Python的tuple及list等操作, 在此基础上, 就可以自由构造PIX对象了.


5.3 TCAS特效相关函数参考

tcaxLib.pyd模块文档
编译版 (更适合查看)
原始文档

pixStone.pyd模板文档
未整理, 仅作参考

util.cairo模块文档
Pycairo Documentation

util.magick模板文档
Magick++ Documentation


5.4 实例教程

完整工程下载:    tcas_example.rar (7.12 MB, 下载次数: 3041)

编写一个TCAS特效, 可以归结为创建PIX, 变换PIX, 将PIX写入文件, 这三个主要步骤, 额外的, 我们一般需要先利用InitFont()函数创建至少一个字体.

教程实例代码如下:
  1. ##################################################################
  2. ## 声明: 本脚本为TCAS特效使用教程所编写, 请广泛传播             ##
  3. ## 教程: http://www.tcax.org/forum.php?mod=viewthread&tid=220 ##
  4. ## 讨论: http://www.tcax.org/forum.php?mod=viewthread&tid=226 ##
  5. ## 版本: 1.0                                                    ##
  6. ## 作者: milkyjing                                              ##
  7. ## 日期: 2012-01-26                                             ##
  8. ##################################################################


  9. ##### 基本函数库, 必须包含 #####

  10. from tcaxPy import *


  11. ##### 拓展函数库, 本特效需要包含 #####

  12. from pixLibs.ImageStone import *


  13. ##### 初始化函数, 用于设定一些全局变量 #####

  14. def tcaxPy_Init():

  15.     ##### 声明全局变量 #####

  16.     global _FD          # Frame Duration, 即一帧的长度, 单位是毫秒, 对于FPS=23.976的特效来说, _FD约为42毫秒
  17.     global _Fs          # Font Size, 即字体大小
  18.     global _Spacing     # 字体间距
  19.     global Font         # 主要字体
  20.     global FontOut      # 字体边框
  21.     global PIX_tex1     # 纹理1, 因为本特效只用到两个静态纹理, 故直接在tcaxPy_Init()函数中定义以提高脚本执行效率
  22.     global PIX_tex2     # 纹理2

  23.     ##### 获取预定义的值 #####

  24.     _FD          = 1000 / GetVal(val_FXFPS)
  25.     _Fs          = GetVal(val_FontSize)
  26.     _Spacing     = GetVal(val_Spacing)
  27.     fontFileName = GetVal(val_FontFileName)    # 字体文件名
  28.     faceID       = GetVal(val_FaceID)          # 字体face序号

  29.     ##### 设置自定义变量的值 #####

  30.     Font     = InitFont(fontFileName, faceID, _Fs, _Spacing, GetVal(val_SpaceScale), MakeRGB(0, 0, 0), 1, False)    # 通过InitFont()函数初始化一个字体
  31.     FontOut  = InitFont(fontFileName, faceID, _Fs, _Spacing, GetVal(val_SpaceScale), MakeRGB(0, 0, 0), 5, True)     # 后三个参数分别为颜色, 边框厚度, 是否只保留边框
  32.     PIX_tex1 = ImagePix(abspath('tex1.png'), _Fs, 0)    # 通过ImagePix()函数载入一张图片作为纹理, abspath()函数用于展开相对路径为绝对路径
  33.     PIX_tex2 = ImagePix(abspath('tex2.png'))            # 后两个参数为目标宽高, 其中之一为0, 表示其值按照保持目标的宽高比不变, 自动进行计算


  34. ##### 结束函数, 用于一些收尾工作 #####

  35. def tcaxPy_Fin():

  36.     ##### 清理一些全局变量 #####

  37.     FinFont(Font)        # 通过InitFont()函数创建的字体必须通过FinFont()函数进行销毁
  38.     FinFont(FontOut)


  39. ##### 脚本主函数, 会对每个文字执行一次 #####
  40. # _i                第_i句, 即当前操作的文字所在的句子序号
  41. # _j                第_i句中的第_j个文字, 即当前操作文字在该行中的序号
  42. # _n                第_i句中有_n个文字, 即当前句子所包含的文字数
  43. # _start        句子的开始时间, 单位为10毫秒
  44. # _end                句子的结束时间, 单位为10毫秒
  45. # _elapk        到第_j个字经过的时间, _start + _elapk 到 _start + _elapk + _k 即为当前文字的存在时间, 单位为10毫秒
  46. # _k                第_j个文字的卡拉OK时间, 单位为10毫秒
  47. # _x                第_j个文字的水平坐标
  48. # _y                第_j个文字的垂直坐标
  49. # _a                第_j个文字的水平跨距, 可以看作文字的宽度, 同样_Fs也可近似看成文字的高度
  50. # _txt                第_j个文字的内容

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

  52.     ASS_BUF  = []        # 保存ASS特效
  53.     TCAS_BUF = []        # 保存TCAS特效

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

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

  58.     if _i == 12:          # 因为时间上有重叠, 所以需要把这一句的坐标往下移一点, 使两句歌词不至于重叠显示
  59.         dy += _Fs + 8

  60.     # 基本时间的计算
  61.     ts_0 = 10 * _start - _FD * 10    # 提前显示歌词, 提前量为10帧长度, "10 * _start"只是一个单位转换, ASS特效使用了两种时间单位, 10毫秒及1毫秒, TCAS特效则统一使用1毫秒为单位
  62.     ts   = 10 * _start
  63.     te   = 10 * _end
  64.     te_0 = te + _FD * 5              # 延后量为5帧长度
  65.     tm   = 10 * (_start + _elapk)    # 当前文字特效开始的时间

  66.     # 构造原始PIX结构对象
  67.     PIX_t   = TextPix(Font, _txt)                   # 通过TextPix()函数从文字构造PIX结构对象
  68.     PIX_t   = PixTexture(PIX_t, PIX_tex1)           # 为PIX_t增加纹理
  69.     PIX_out = TextPix(FontOut, _txt)                # 获取边框
  70.     PIX_out = PixBlur(PIX_out, 6)                   # 增加模糊
  71.     PIX_out = PixTexture(PIX_out, PIX_tex2)         # 增加纹理
  72.     PIX_out = PixColorMul(PIX_out, 1, 1, 1, 0.8)    # 减少不透明度, 即增加透明度
  73.     PIX_0   = CombinePixs(PIX_out, PIX_t)           # 混合文字主体和边框 (边框作底)

  74.     # 入场效果, 移动(用到了简单的平面几何知识) + 模糊逐渐变清晰
  75.     center = _n / 2 - 0.5      # 根据该公式5个字符的中心索引为2, 6个字符的中心索引为2.5, 因为索引是从0开始计算的
  76.     x = dx + 50 * (_j - center) / center
  77.     y = dy + 10
  78.     for i in range(10):
  79.         x = x + (dx - x) * (i + 1) / 5      # 逐帧修改坐标
  80.         y = y + (dy - y) * (i + 1) / 5
  81.         PIX = PixBlur(PIX_0, 40 - i * 4)    # 逐渐减少模糊度
  82.         tcas_main(TCAS_BUF, PIX, ts_0 + _FD * i, ts_0 + _FD * (i + 1), x, y, 0)    # 通过tcas_main()函数向TCAS_BUF缓冲带增加一个PIX对象, 最后一个参数表示Layer, 含义与ASS特效中的Layer相同

  83.     # 存在效果, 无特殊效果
  84.     PIX = PIX_0
  85.     tcas_main(TCAS_BUF, PIX, ts, te, dx, dy, 0)

  86.     # 表现效果, 闪烁特效
  87.     for dur in range(0, 10 * _k, int(2 * _FD)):
  88.         PIX = pstSoftGlow(PIX_0, 10, 180, 180)    # 柔光效果, 该函数定义在pixStone.pyd模块中
  89.         tcas_main(TCAS_BUF, PIX, tm + dur, tm + dur + _FD, dx, dy, 0)    # 隔一帧显示一次

  90.     # 出场效果, 清晰变模糊 + 淡出
  91.     for i in range(5):
  92.         PIX = PixBlur(PIX_0, (i + 1) * 4)    # 逐渐增加模糊度
  93.         PIX = PixColorMul(PIX, 1, 1, 1, 0.5 + 0.5 * (5 - i - 1) / 5)    # 逐渐减少不透明度, 即逐渐变得透明
  94.         tcas_main(TCAS_BUF, PIX, te_0 - _FD * (5 - i), te_0 - _FD * (5 - i - 1), dx, dy, 0)

  95.     ##### 将结果返回给TCAX进行处理 #####

  96.     return (ASS_BUF, TCAS_BUF)
复制代码
该代码中使用的函数的具体描述, 可以参考本教程的5.3节



旧版示意图

旧版示意图

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-1-25 20:16:24 |显示全部楼层

6. 重要思想方法及重要函数介绍

6.1 图像处理简介

鉴于TCAS是一个位图系统, 我们自然会联想到PS.
  Photoshop各种丰富的笔刷、图层样式、效果滤镜等为我们制作特殊效果提供了很大的方便,无论是单独使用某种工具或是综合运用各种技巧,Photoshop都能帮助我们创造出神奇精彩的特殊效果。

TCAS中也有许多类似概念. TCAS的核心模块tcaxLib.pyd提供了一些最基本的操作, 比如图层, 纹理, 遮罩, 滤镜等. 考虑到这些概念的重要性, 这里作个简略的说明.

图层: 任何PIX都可以作为一个图层, 我们可以在同一位置叠加复数个PIX以生成一个新的PIX, 由CombinePixs()函数及BIG_PIX结构支持, 另外, TCAS文件本身也支持图层(最高16层).

纹理: 通俗的说既是花纹或表面细节, 实际上任何PIX都可以作为纹理, 通过PixTexture()函数, 我们可以把一张纹理PIX贴到一个目标PIX上, 使其看起来更加丰富.

遮罩: 所谓的遮罩既是遮住不需要的部分, 让其不显示出来, 任何PIX都可以作为遮罩, 通过PixMask()函数, 我们可以将一个遮罩PIX应用到一个目标PIX上, 以去除不希望显示的部分.

滤镜: 简单的说就是对一个PIX进行一定的变换生成一张新的PIX, 如常用的模糊效果滤镜PixBlur()函数.

而所谓的TCAS特效就是"PS"出这样一个一个的PIX, 然后让其在恰当的时间, 恰当的位置显示而已.


6.2 PIX的坐标定位

TCAS特效中, 坐标原点一律为视频的左上角.
准确定位一个PIX, 需要两个偏移量(相对于坐标原点而言), 一个内部偏移量, 即PIX[0]的值, 一个外部偏移量, 即tcas_main()等函数所指定的值. 读者可能会有这么一个疑问, 为什么不只用内部偏移量或外部偏移量? 这主要是为了方便文字类PIX的排版, 同时也可以简化一些代码.

PIX定位

PIX定位
         pix_position.rar (1.5 KB, 下载次数: 3188)         

ASS定位: {\an7\pos(0,0)\fs80\fnArial\bord0\shad0\c1&H0000FF\b0}M

ASS定位: {\an7\pos(0,0)\fs80\fnArial\bord0\shad0\c1&H0000FF\b0}M

如果我们把"M"这个字放到坐标(50, 100)上(图中黑色矩形的左上角坐标), 它的实际显示位置则如图红色"M"所示, 与黑色矩形有一定的偏差, 而该偏差在文字排版中是实际需要的(理由这里从略, 可以理解成是为了美观考虑. 可以在ASS中试验一下, 使用代码{\an7\pos(0, 0)\fs80\fnArial}M, 会发现"M"并没有紧挨着视频左上角), 所以我们将该值保存在PIX[0]中.
另外, 一些函数可能也会改变PIX[0]的值, 如PixBlur(), PixStrip()等, 但所有函数都满足以下原则: 不管是何PIX操作函数, 调用过后, 都不会改变PIX的外部定位, PIX[0]值改变的标准为PIX的中心保持不变. 如, PIX与PIX2 = PixBlur(PIX, 2)的PIX[0]值虽然不同, 但在相同的外部偏移量下, 它们的中心点坐标是一致的.


6.3 CombinePixs()函数及BIG_PIX介绍

CombinePixs()函数用于叠加两个PIX, 如果用tcas_main()函数输出这个叠加后的PIX, 效果与直接使用两次tcas_main()函数分别输出两个原始PIX是一样的. 如图,

pix combine

pix combine

第一三行是通过直接输入两个原始PIX得到的结果, 第二四行是通过输出一个叠加后的PIX得到的结果.
完整工程下载:    pix_combine.rar (2.11 KB, 下载次数: 3260)

利用CombinePixs()函数, 我们不仅可以减少输出的文件体积, 而且可以更方便的制作一些效果, 比如, 为一个文字类PIX增加边框, 阴影等. 该函数是图层概念的一个特例. 使用也非常的频繁.

BIG_PIX结构则比较完整的实现了图层概念. 它突破了CombinePixs()函数的若干局限: 图层个数可以任意个, 可以设置图层顺序, 可以设置外部偏移量. 关于该结构有3个相关函数: InitBigPix()初始化一个BIG_PIX结构对象, 实际上该函数等价于BIG_PIX = [], BigPixAdd()往BIG_PIX结构对象添加一个PIX(图层), 以及最重要的ConvertBigPix()转换BIG_PIX结构对象为一个独立的PIX结构对象.

BIG_PIX

BIG_PIX

完整工程下载:    tcas_bigpix.rar (3.04 KB, 下载次数: 3224)
Gundam_Seed_OP特效中也使用了该结构. 可以作为参考.


6.4 BilinearFilter()函数及动画平滑

动画平滑是个很大的课题, 这里只用实际例子做一个简单的介绍.

运动的不平滑(或者说"抽筋状"), 是由屏幕显示精度有限造成的. 举个简单的例子, 在24帧内将一个物体移动77像素, 则每帧需移动77/24=3.21像素, 但像素不能是分数, 故可想而知此物体的移动不会平滑. 借助BilinearFilter()函数, 我们可以让物体在"分数像素位置"显示. 假如一个PIX的内部偏移量为(0.4, 0.5), 我们指定一个外部偏移量(10.3, 20), 则调用BilinearFilter(PIX, 10.3, 20), 返回一个新的PIX, 该PIX的内部偏移量不会改变, 但其内容发生了细微变化, 使其在(10, 20)处显示, 就和原来的PIX在(10.7, 20.5)处显示一样. 通过下面这个实际例子, 我们可以非常清楚的观察到这些差别.
完整工程下载:    tcas_test_bilinear.rar (8.5 KB, 下载次数: 3204)
当然, 也不是只要牵涉到运动就需要调用BilinearFilter()函数, 还是得根据运动的精细程度而定, 比如在5帧内移动77个像素, 则77/5=15.4, 相比于整数部分, 小数部分基本上可以被忽略, 人眼无法察觉如此细微的差别, 更何况时间只有0.04秒. 所以, 还是依照最终效果来决定使不使用BilinearFilter()函数.

对于位图的放大, 也有相似情况, 比如在24帧内, 将一个40*40大小的图片放大到60*60, 则对于宽度, 每帧需增加20/24=0.83, 同样会造成一种不平滑状态. 用PixResizeF()函数代替PixResize()可以在一定程度上减少这种不平滑度. 具体用法见例子.
完整工程下载:    tcas_test_smooth_resize.rar (12.45 KB, 下载次数: 3261)


6.5 PixTexture(), PixMask()函数简介

PixTexture()函数, 将一个PIX作为纹理, 贴到目标PIX上, 纹理PIX的内部偏移量会被忽略, 并且纹理PIX的大小会自动缩放为目标PIX大小. 该函数使用得非常频繁.

PixMask()函数, 将一个PIX作为遮罩, 应用到目标PIX上, 两个PIX的内部偏移量都会被使用, 用来确定目标PIX是否位于遮罩PIX的区域中. 用法可参考Gundam_Seed_OP特效, 以及saiyaku编写的TCAS特效 MASK example


6.6 其他一些函数

To be continued...



正式会员

爱理人士

Rank: 4

发表于 2012-2-1 02:58:01 |显示全部楼层
很详细了   milk大大很有爱啊!

Rank: 4

发表于 2012-2-1 16:32:50 |显示全部楼层
终于有一个详细的教程看了。

Rank: 4

发表于 2012-2-4 09:58:53 |显示全部楼层
小白表示大爱啊,,

Rank: 5Rank: 5

发表于 2012-2-7 21:15:50 |显示全部楼层
坐等continue。。。。

Rank: 4

发表于 2012-2-9 21:04:36 |显示全部楼层
话说当初想顶,但具插教程的楼

Rank: 4

发表于 2012-2-22 16:50:59 |显示全部楼层
lz整理辛苦了~

Rank: 4

发表于 2012-2-23 10:53:32 |显示全部楼层
表示俺已经被时代抛弃了

Rank: 1

发表于 2012-2-24 15:38:11 |显示全部楼层
不错  找到了

Moderator

youkaze

Rank: 5Rank: 5

发表于 2012-2-28 18:17:32 |显示全部楼层
今天教室机房居然有网 然后蛋疼的看了下这个 嗯开始学习TCAS争取早日能撸个出来
(PS:机房网络下东西真快……下次时间轴也带到机房去做得了

Rank: 5Rank: 5

发表于 2012-2-28 22:26:48 |显示全部楼层
七海の游风 发表于 2012-2-28 18:17
今天教室机房居然有网 然后蛋疼的看了下这个 嗯开始学习TCAS争取早日能撸个出来
(PS:机房网络下东西真快 ...

混蛋你不是早就开始撸这个了么、、

Moderator

youkaze

Rank: 5Rank: 5

发表于 2012-2-28 22:38:54 |显示全部楼层
six 发表于 2012-2-28 22:26
混蛋你不是早就开始撸这个了么、、

额 没有啊 一直没时间看 今天RP好就上课看了一段

Rank: 5Rank: 5

发表于 2012-3-11 00:33:52 |显示全部楼层
本帖最后由 忘却の小伊 于 2012-3-11 00:34 编辑


把这图的颜色调一下吧···
咱因为这图的颜色,理解错误了..


咱改了下颜色···觉得可以就拿去...



觉得可以就用.png

Rank: 4

发表于 2012-3-22 23:49:42 |显示全部楼层
很厉害啊!辛苦牛奶大了。。终于整理出来详细教程了呢。。马上就要高考了。。在纠结大学是学影视后期还是软件工程。。。
您需要登录后才可以回帖 登录 | 新人加入

GitHub|TCAX 主页

GMT+8, 2024-3-19 11:39

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部
RealH