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

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

[特效算法] 模拟透镜畸变 [需要改进] [复制链接]

Moderator

Effect Researcher.

Rank: 5Rank: 5

跳转到指定楼层
楼主
发表于 2016-6-2 19:43:17 |只看该作者 |倒序浏览
模拟透镜畸变 (Lens Distortion),参考 wikipedia
其实探索过程中发现,这个变换还有很多花样,可以多尝试改变变换。
注意,畸变因子,尽量选得小一些,例如 0.001。
这个是用 ASS 的,生成一行观察效果就可以了,生成多行体积会比较大。
不足是,坐标变换后,因为是浮点,字的像素会变得不紧密,看起来是栅栏状,加上边框色会好一些,但是边界会显得模糊。
有时间会写 TCAS,以及改善栅栏问题。
请看工程。
链接: http://pan.baidu.com/s/1jHXCv8E 密码: hb65
  1. from tcaxPy import *

  2. def tcaxPy_Init():
  3.     global user_font
  4.     global font_size
  5.     global distoration_center    # 畸变中心点,元组
  6.     global framedur
  7.     font_size = GetVal(val_FontSize)
  8.     distoration_center = (640, GetVal(val_OffsetY) + font_size / 2)
  9.     framedur = 1000 / GetVal(val_FXFPS)    # 帧时间,毫秒
  10.     user_font = InitFont(GetVal(val_FontFileName), GetVal(val_FaceID), font_size, GetVal(val_Spacing), GetVal(val_SpaceScale), DecRGB(GetVal(val_1C)), 0, 0)

  11. def tcaxPy_Fin():
  12.     FinFont(user_font)

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

  14.     ASS_BUF  = []        # used for saving ASS FX lines

  15.     if _i == 0:
  16.         pix_syl = TextPix(user_font, _txt)

  17.         # 从字的左上角开始,初始坐标
  18.         posx_init     = _x - _a / 2        + pix_syl[0][0]
  19.         posy_init     = _y - font_size / 2 + pix_syl[0][1]
  20.         width, height = pix_syl[1]    # 字的宽和高

  21.         # 逐行扫描
  22.         for i in range(height):
  23.             for j in range(width):
  24.                 idx = 4 * (i * width + j)
  25.                 channelR, channelG, channelB, channelA = pix_syl[2][idx : idx + 4]    # RGBA 通道值
  26.                 if channelA != 0:    # 若字不透明,则绘制粒子
  27.                     for k in range(200):    # 200帧的变化时间长度
  28.                         # 绝对坐标
  29.                         posx = posx_init + j
  30.                         posy = posy_init + i
  31.                         # 转换为与畸变中心点的相对坐标
  32.                         relative_posx = posx - distoration_center[0]
  33.                         relative_posy = posy - distoration_center[1]
  34.                         r_square = (posx - distoration_center[0]) ** 2 + (posy - distoration_center[1]) ** 2
  35.                         # 畸变的坐标变换
  36.                         relative_posx = relative_posx * (1 + 0.0001 * (199 - k) / 199 * r_square)
  37.                         relative_posy = relative_posy * (1 + 0.0001 * (199 - k) / 199 * r_square)
  38.                         # 转换为绝对坐标
  39.                         posx += relative_posx
  40.                         posy += relative_posy
  41.                         ts = _start + framedur * k / 10
  42.                         te = _start + framedur * (k + 1) / 10
  43.                         effect = pos(posx, posy) + color1(FmtRGB(channelR, channelG, channelB)) + alpha1(255 - channelA)
  44.                         ass_main(ASS_BUF, SubL(ts, te, 0, 'TCPS'), effect, DrawPoint())

  45.     return (ASS_BUF, None)
复制代码
1

查看全部评分

Rank: 4

沙发
发表于 2016-6-3 00:08:06 |只看该作者
可以的666

Rank: 4

板凳
发表于 2016-11-25 20:22:15 |只看该作者
支持

Rank: 4

地板
发表于 2017-1-17 00:44:02 |只看该作者
支持,谢谢分享

Rank: 4

5#
发表于 2022-2-13 21:24:23 |只看该作者
本帖最后由 Seekladoom 于 2022-2-13 21:27 编辑

配合如下帖学习效果更佳,这里的模拟透镜畸变算法更完善:
[kawori] newgame_edfx

您需要登录后才可以回帖 登录 | 新人加入

GitHub|TCAX 主页

GMT+8, 2024-11-22 10:16

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部
RealH