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

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

【ミルク】成长日记(笑) [复制链接]

Rank: 4

跳转到指定楼层
楼主
发表于 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), ...)
复制代码
1

查看全部评分

Rank: 4

沙发
发表于 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




Rank: 4

板凳
发表于 2012-8-3 19:19:23 |只看该作者

tcCurve模块初版定型

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

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

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

测试用例

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

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

Rank: 4

地板
发表于 2012-8-5 11:08:29 |只看该作者

高达Seed高清重制版ED2特效

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

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

待续。

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

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

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

Rank: 4

5#
发表于 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, 下载次数: 1728)

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

Rank: 4

6#
发表于 2012-8-9 12:31:04 |只看该作者

省时间的小技巧

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

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

Rank: 4

7#
发表于 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
复制代码

Rank: 4

8#
发表于 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
复制代码
您需要登录后才可以回帖 登录 | 新人加入

GitHub|TCAX 主页

GMT+8, 2024-4-25 03:58

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部
RealH