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

标题: 【ミルク】成长日记(笑) [打印本页]

作者: ミルク    时间: 2012-8-2 21:18:23     标题: 【ミルク】成长日记(笑)

本帖最后由 ミルク 于 2012-8-3 18:54 编辑

Bezier Curve (贝塞尔曲线)
http://en.wikipedia.org/wiki/B%C3%A9zier_curve

Bezier Curve's De Casteljau's algorithm (贝塞尔曲线生成算法)
http://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm

Python Implementation (Py代码实现)
  1. # p0 and p1 are end points, t belongs to [0, 1]
  2. def LinearBezier(p0, p1, t):
  3.     lb = lambda i: (1 - t) * p0[i] + t * p1[i]
  4.     return (lb(0), lb(1), 255)    # 255 is the point's alpha value, to meet the TCAX's point structure requirement ((x, y, a), (x, y, a), ...)

  5. # p0 and p2 are end points, p1 is a control point, t belongs to [0, 1]
  6. def QuadraticBezier(p0, p1, p2, t):
  7.     qb = lambda i: (1 - t) * (1 - t) * p0[i] + 2 * (1 - t) * t * p1[i] + t * t * p2[i]
  8.     return (qb(0), qb(1), 255)    # 255 is the point's alpha value, to meet the TCAX's point structure requirement ((x, y, a), (x, y, a), ...)

  9. # p0 and p3 are end points, p1 and p2 are control points, t belongs to [0, 1]
  10. def CubicBezier(p0, p1, p2, p3, t):
  11.     cb = lambda i: (1 - t) * (1 - t) * (1 - t) * p0[i] + 3 * (1 - t) * (1 - t) * t * p1[i] + 3 * (1 - t) * t * t * p2[i] + t * t * t * p3[i]
  12.     return (cb(0), cb(1), 255)    # 255 is the point's alpha value, to meet the TCAX's point structure requirement ((x, y, a), (x, y, a), ...)

  13. def _Fac(n):
  14.     M = 1
  15.     for i in range(2, n + 1):
  16.         M *= i
  17.     return M

  18. def _Combi(n, m):
  19.     return _Fac(n) // (_Fac(n - m) * _Fac(m))

  20. # p is a list of control points, p[0] and p[len(p) - 1] are end points, t belongs to [0, 1]
  21. def Bezier(p, t):
  22.     num = len(p)
  23.     order = num - 1
  24.     x = 0
  25.     y = 0
  26.     for i in range(num):
  27.         b = lambda j: _Combi(order, i) * pow(1 - t, order - i) * pow(t, i) * p[i][j]
  28.         x += b(0)
  29.         y += b(1)
  30.     return (x, y, 255)    # 255 is the point's alpha value, to meet the TCAX's point structure requirement ((x, y, a), (x, y, a), ...)
复制代码

作者: ミルク    时间: 2012-8-3 18:56:56     标题: UCBS使用心得

本帖最后由 ミルク 于 2012-8-3 19:15 编辑

如果想要使UCBS更靠近某个控制点,可以重复一次该控制点,比如
[(200, 500), (300, 100), (700, 100), (400, 500), (600, 700), (800, 400), (700, 200), (900, 300), (660, 400)]

1.png

想要更靠近第二个控制点,则
[(200, 500), (300, 100), (300, 100), (700, 100), (400, 500), (600, 700), (800, 400), (700, 200), (900, 300), (660, 400)]

2.png

如果想要直接经过该控制点,则需要重复两次,比如
[(200, 500), (300, 100), (700, 100), (400, 500), (600, 700), (800, 400), (700, 200), (900, 300), (660, 400)]
想要经过第一个控制点(起点),则
[(200, 500), (200, 500), (200, 500), (300, 100), (700, 100), (400, 500), (600, 700), (800, 400), (700, 200), (900, 300), (660, 400)]

3.png

注意1:重复某个控制点,会降低曲线在该点处的高阶连续性
注意2:如果要使用匀速版本,则在重复某点第二遍时,需要为x(或y)任意加上一个小量,比如
[(200, 500), (200, 500), (200, 500.000001), (300, 100), (700, 100), (400, 500), (600, 700), (800, 400), (700, 200), (900, 300), (660, 400)]

4.png

以避免“除零错误”(division by zero)

可以通过复制最初3个控制点到最后3个控制点来构造闭合UCBS,比如
[(200, 500), (300, 100), (700, 100), (400, 500), (600, 700), (800, 400), (700, 200), (900, 300), (660, 400)]
重复后为
[(200, 500), (300, 100), (700, 100), (400, 500), (600, 700), (800, 400), (700, 200), (900, 300), (660, 400), (200, 500), (300, 100), (700, 100)]

普通版本

6.png

匀速版本

5.png






图片附件: 6.png (2012-8-3 19:10:41, 15.6 KB) / 下载次数 586
http://www.tcax.org/forum.php?mod=attachment&aid=ODMwfDJjZGQ5ZTEzfDE3MTQ4NDkxNTl8MHww



图片附件: 5.png (2012-8-3 19:10:40, 15.89 KB) / 下载次数 608
http://www.tcax.org/forum.php?mod=attachment&aid=ODI5fDc2ODAyYTAyfDE3MTQ4NDkxNTl8MHww



图片附件: 4.png (2012-8-3 19:10:39, 13.64 KB) / 下载次数 598
http://www.tcax.org/forum.php?mod=attachment&aid=ODI4fDRhODAzN2QzfDE3MTQ4NDkxNTl8MHww



图片附件: 3.png (2012-8-3 19:10:37, 12.94 KB) / 下载次数 603
http://www.tcax.org/forum.php?mod=attachment&aid=ODI3fDJkODkzOGQ0fDE3MTQ4NDkxNTl8MHww



图片附件: 2.png (2012-8-3 19:15:04, 11.92 KB) / 下载次数 583
http://www.tcax.org/forum.php?mod=attachment&aid=ODMyfGIwMjk0OGY5fDE3MTQ4NDkxNTl8MHww



图片附件: 1.png (2012-8-3 19:10:35, 11.46 KB) / 下载次数 580
http://www.tcax.org/forum.php?mod=attachment&aid=ODI1fGVmODg5OGJlfDE3MTQ4NDkxNTl8MHww


作者: ミルク    时间: 2012-8-3 19:19:23     标题: tcCurve模块初版定型

本帖最后由 ミルク 于 2012-8-4 00:54 编辑

tcCurve.py (11.17 KB, 下载次数: 1366)

建议放到TCAX跟目录的util文件夹下

测试用例

test_curves.rar (2.55 KB, 下载次数: 1393)

p.s. 该模块已经包含到了TCAX 1.2.0版本中



附件: test_curves.rar (2012-8-3 19:18:58, 2.55 KB) / 下载次数 1393
http://www.tcax.org/forum.php?mod=attachment&aid=ODM0fGM5YmI2NDA2fDE3MTQ4NDkxNTl8MHww

附件: tcCurve.py (2012-8-3 19:18:15, 11.17 KB) / 下载次数 1366
http://www.tcax.org/forum.php?mod=attachment&aid=ODMzfDU5ODJiZjFkfDE3MTQ4NDkxNTl8MHww
作者: ミルク    时间: 2012-8-5 11:08:29     标题: 高达Seed高清重制版ED2特效

本帖最后由 ミルク 于 2012-8-12 02:51 编辑

开始填坑。
要求是竖排字幕,左边日文右边中文。
个人感觉竖排也挺合适。不过日文应该放右边(这貌似是个习惯)
可以参考的是猫神OP特效。

待续。

------------------------------

Gundam_Seed_ED2.rar (8.19 KB, 下载次数: 1402)

最后还剩Horizon II的OP了...填完闪人....



附件: Gundam_Seed_ED2.rar (2012-8-12 02:50:42, 8.19 KB) / 下载次数 1402
http://www.tcax.org/forum.php?mod=attachment&aid=ODc2fDgwZDdhMGNkfDE3MTQ4NDkxNTl8MHww
作者: ミルク    时间: 2012-8-6 15:31:19     标题: TCAX模块升级

在120的基础上进行的小更新:

bug-fix tcCurve.py  - fix the wrong expressions of derivatives of x(t) and y(t) in UCBSpline class
update tcaxPy.py    - change on tag: org, now supports floating numbers


tcCurve.py (11.24 KB, 下载次数: 1748)

tcaxPy.py (35.11 KB, 下载次数: 1341)



附件: tcCurve.py (2012-8-6 15:31:09, 11.24 KB) / 下载次数 1748
http://www.tcax.org/forum.php?mod=attachment&aid=ODYxfDU0ZjJjZDE2fDE3MTQ4NDkxNTl8MHww

附件: tcaxPy.py (2012-8-6 15:31:08, 35.11 KB) / 下载次数 1341
http://www.tcax.org/forum.php?mod=attachment&aid=ODYwfDMzNzNlMmZmfDE3MTQ4NDkxNTl8MHww
作者: ミルク    时间: 2012-8-9 12:31:04     标题: 省时间的小技巧

在用TCAX编写特效时, 如果需要反复调整代码, 执行后看效果, 而且代码执行时间又相对较短, 可以在tcaxPy_Fin()函数的最末尾加上

sys.exit(), 这样就可以自动关闭执行窗口.


作者: ミルク    时间: 2012-8-10 16:40:46     标题: 切割PIX为复数块小PIX

本帖最后由 ミルク 于 2012-8-10 17:51 编辑

函数原型

PIX_list = PixSubClips(PIX, clip_param)

PIX_list是一个包含多个小PIX的数组, 这些PIX拼凑在一起可以形成一个完整的原始PIX.
PIX是输入的原始数据
clip_param为切割参数, 表明如何切割这个PIX.

一个可行的方案是用横竖线去切割.

比如水平线 (4, 11, 30, 33), 注: 第一个数值不应小于1, 最后一个数值不应大于PIX[1][0] - 1

垂直线 (10, 23, 24), 注: 第一个数值不应小于1, 最后一个数值不应大于PIX[1][1] - 1


算法
  1. def PixSubClips(PIX, xv, yv):
  2.     PIX_list = []
  3.     xv = list(xv)
  4.     yv = list(yv)
  5.     xv.append(PIX[1][0])
  6.     yv.append(PIX[1][1])
  7.     xv.sort()
  8.     yv.sort()
  9.     xn = len(xv)
  10.     yn = len(yv)
  11.     y_off = 0
  12.     for j in range(yn):
  13.         x_off = 0
  14.         for i in range(xn):
  15.             PIX_sub_pos = (PIX[0][0] + x_off, PIX[0][1] + y_off)
  16.             PIX_sub_res = (xv[i] - x_off, yv[j] - y_off)
  17.             PIX_sub_rgba = []
  18.             for h in range(PIX_sub_res[1]):
  19.                 for w in range(PIX_sub_res[0]):
  20.                     idx = 4 * ((h + y_off) * PIX[1][0] + w + x_off)
  21.                     PIX_sub_rgba.append(PIX[2][idx])
  22.                     PIX_sub_rgba.append(PIX[2][idx + 1])
  23.                     PIX_sub_rgba.append(PIX[2][idx + 2])
  24.                     PIX_sub_rgba.append(PIX[2][idx + 3])
  25.             PIX_list.append((PIX_sub_pos, PIX_sub_res, tuple(PIX_sub_rgba)))
  26.             x_off = xv[i]
  27.         y_off = yv[j]
  28.     return PIX_list
复制代码

作者: ミルク    时间: 2012-8-10 19:51:51

  1. def Sign(x):
  2.     if x > 0:
  3.         return 1
  4.     elif x == 0:
  5.         return 0
  6.     else:
  7.         return -1
复制代码





欢迎光临 TCAX 字幕特效制作工具官方论坛 | ASS | TCAS | Python | Aegisub | Lua (http://www.tcax.org/) Powered by Discuz! X2