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

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

【NyuFX】NyuFX教程.进阶篇 [复制链接]

Moderator

后弃

Rank: 5Rank: 5

跳转到指定楼层
楼主
发表于 2013-1-25 09:36:38 |只看该作者 |正序浏览
本帖最后由 showjim 于 2013-1-25 12:52 编辑

总序
这里讲详细介绍NyuFX的各种关键字和功能,属于比较枯燥的
已经掌握的可以看这里,[后弃]一点记录,和我谈论算法。

第一课:简译ASS Value

正文
这里大概向大家讲一下NyuFX ASS value。
NyuFX ASS value是软件作者重新定义的一些功能变量,类似于AEGISUB里的line、syl和char等以及TCAX里的_start、_end和_elapk等。全部ass value可以在“Help-->Help Browser”里找到。
这里只列一些经常要用到的:

lines句子的 table
.layer
句子的字幕层 number
.start_time
句子的起始时间 (ms) number
.end_time
句子的结束时间 (ms) number
.duration
句子的持续时间 (ms) number
.infade
与前一句的间空时间 (ms; 第一句前 = 1000.1) number
.outfade
与后一句的间空时间 (ms, 最后一句后 = 1000.1) number
.text
句子文本 string
.i
句子的目录 number
.width
句子文本宽 number
.height
句子的文本高 number
.x
句子的X轴坐标 (取决于定位) number
.y
句子的Y轴坐标 (取决于定位) number
.left
句子的最左坐标(X) number
.center
句子的中心坐标(X) number
.right
句子的最右坐标(X) number
.top
句子的顶坐标(Y) number
.middle
句子的中间坐标(Y) number
.bottom
句子的底部坐标(Y) number


.syls
音节的 table
.i
目录 number
.word_i
字符文本目录 number
.start_time
起始时间 (ms) number
.end_time
结束时间 (ms) number
.duration
持续时间 (ms) number
.text
文本 string
.width
文本宽 number
.height
文本高 number
.x
X轴坐标 (取决于定位) number
.y
Y轴坐标 (取决于定位) number
.left
最左坐标(X) number
.center
中心坐标(X)number
.right
最右坐标(X)number
.top
顶坐标(Y)number
.middle
中间坐标(Y)number
.bottom
底部坐标(Y) number


.chars
字符 table
.i
目录 number
.syl_i
音节文本目录 number
.word_i
字符文本目录 number
.start_time
起始时间 (ms) number
.end_time
结束时间 (ms) number
.duration
持续时间 (ms) number
.text
文本 string
.width
文本宽 number
.height
文本高 number
.x
X轴坐标 (取决于定位) number
.y
Y轴坐标 (取决于定位) number
.left
最左坐标(X) number
.center
中心坐标(X)number
.right
最右坐标(X)number
.top
顶坐标(Y)number
.middle
中间坐标(Y)number
.bottom
底部坐标(Y) number

4

查看全部评分

Rank: 4

15#
发表于 2018-5-6 00:59:33 |只看该作者
支持++1

Rank: 4

14#
发表于 2017-12-17 00:34:07 |只看该作者
感谢分享

Moderator

Effect Researcher.

Rank: 5Rank: 5

13#
发表于 2015-3-7 23:59:25 |只看该作者
Lua的路还很远啊~

Rank: 4

12#
发表于 2013-10-8 10:29:07 |只看该作者
必须顶起!!新人学习~

Rank: 4

11#
发表于 2013-2-11 15:14:20 |只看该作者
新人学习一下

Moderator

疯子

Rank: 5Rank: 5

10#
发表于 2013-2-4 20:29:05 |只看该作者
哔哔姐是十年磨一剑的大神

正式会员

妖木

Rank: 4

9#
发表于 2013-2-4 19:28:42 |只看该作者
绝逼没有啊!!!!我当时再考虑说粒子好还是说我起床继续围观,表示粒子好比较合乎主题啊!!!
1

查看全部评分

正式会员

妖木

Rank: 4

8#
发表于 2013-2-4 19:09:31 |只看该作者
怒顶……还是粒子好啊
1

查看全部评分

Rank: 6Rank: 6

7#
发表于 2013-2-4 18:44:34 |只看该作者
果然还是粒子好啊
1

查看全部评分

Rank: 4

6#
发表于 2013-2-4 17:20:10 |只看该作者
多年前注册一号,特地来支持后弃~
1

查看全部评分

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

5#
发表于 2013-1-29 22:01:26 |只看该作者
插樓支持一下
1

查看全部评分

Rank: 4

地板
发表于 2013-1-29 14:35:55 |只看该作者

Moderator

后弃

Rank: 5Rank: 5

板凳
发表于 2013-1-26 12:12:36 |只看该作者
本帖最后由 showjim 于 2013-2-4 10:55 编辑

第三课:脚本教程2


这里将讲解一个NyuFX的代码实例。效果为字体粒子化和Mask的使用。
代码&字幕下载: tutorial_2.zip (2.31 KB, 下载次数: 54, 售价: 1 论坛币)


正文
此代码为NyuFX内置模板实例,我在这对其稍微讲解。
  1. function roumaji(line, l)
  2.         l.style = "p"        --像素点不需要边宽并且设定7为对其方式
  3.         for si, syl in ipairs(line.syls) do
  4.                 l.end_time = line.start_time + syl.end_time + 400
  5.                 for pi, pixel in ipairs( convert.text_to_pixels(syl.text, line.styleref) ) do
  6.                         local x, y = pixel.x + math.round(syl.left), pixel.y + math.round(syl.top)
  7.                         local alpha = (pixel.a == 255) and "" or ("\\1a" .. convert.a_to_ass(pixel.a))  ---此句用于获取像素的透明信息
  8.                         l.start_time = line.start_time - line.infade / 2 * math.random(100) / 100
  9.                         local start_offset = (line.start_time + syl.start_time) - l.start_time  ---设定像素其实移动时间
  10.                         l.text = string.format("{\\move(%d,%d,%d,%d,%d,%d)\\fad(0,400)%s\\p1}m 0 0 l 1 0 1 1 0 1"
  11.                                                                 , x, y, x + math.random(-10,10), y + math.random(-10,10), start_offset, start_offset + syl.duration + 400
  12.                                                                 , alpha) ---1.这个string是用来指定像素点在特定时间范围内从原位置运动到末裔随机点; 2.此处要特别注意alpha,这个是用来还原字体边角。
  13.                         io.write_line(l)
  14.                 end
  15.         end
  16. end

  17. --此处基本同上
  18. function kanji(line, l)
  19.         l.style = "p"
  20.         for si, char in ipairs(line.chars) do
  21.                 l.end_time = line.start_time + char.end_time + 400
  22.                 for pi, pixel in ipairs( convert.text_to_pixels(char.text, line.styleref) ) do
  23.                         local x, y = pixel.x + math.round(char.left), pixel.y + math.round(char.top)
  24.                         local alpha = (pixel.a == 255) and "" or ("\\1a" .. convert.a_to_ass(pixel.a))
  25.                         l.start_time = line.start_time - line.infade / 2 * math.random(0,100) / 100
  26.                         local start_offset = (line.start_time + char.start_time) - l.start_time
  27.                         l.text = string.format("{\\move(%d,%d,%d,%d,%d,%d)\\fad(0,400)%s\\p1}m 0 0 l 1 0 1 1 0 1", x, y, x + math.random(-10,10), y + math.random(-10,10), start_offset, start_offset + char.duration + 400, alpha)
  28.                         io.write_line(l)
  29.                 end
  30.         end
  31. end

  32. function sub(line, l)

  33.         --Text
  34.         l.start_time = line.start_time - line.infade/2
  35.         l.end_time = line.end_time + line.outfade/2
  36.         l.text = string.format("{\\fad(%d,%d)\\bord0\\1c&H101010&}%s", line.infade/2, line.outfade/2, line.text)
  37.         io.write_line(l) ---
  38.        
  39.         --Mask,这个对用TCAX的应该很熟悉
  40.         local mask = shape.move( convert.text_to_shape(line.text, line.styleref), line.left*8, line.top*8) --字体会以原8倍大小转化成ASSDraw代码
  41.         local shine = shape.ellipse(20, 20) --生成一个椭圆型
  42.         l.style = "p"
  43.         l.start_time = line.start_time
  44.         l.end_time = line.end_time
  45.         l.text = string.format("{\\move(%.3f,%.3f,%.3f,%.3f)\\blur4\\clip(4,%s)\\p1}%s", line.left - 20, line.top + (line.height - 20) / 2, line.right, line.top + (line.height - 20) / 2, mask, shine)
  46.         io.write_line(l)
  47. end

  48. for li, line in ipairs(lines) do
  49.         if line.styleref.alignment >=7 then
  50.                 roumaji( line, table.copy(line) )
  51.         elseif line.styleref.alignment <=3 then
  52.                 sub( line, table.copy(line) )
  53.         else
  54.                 kanji( line, table.copy(line) )
  55.         end
  56.         io.progressbar(li / #lines)  --此为让NyuFX的UI显示生成进度
  57. end
复制代码
此代码由三个子函数和一个main组成,虽然main没明写……
它们分别为roumaji()、sub()、kanji()和最后的for循环(相当于main了)。
代码解释如注释,这里讲解代码里的一些NyuFX的关键字的重点用法:

1. convert.text_to_pixels :
    代码里调用如下:convert.text_to_pixels(syl.text, line.styleref),syl.text指音节里的字,line.styleref指此行的字体样式。

2. \\clip(4,%s):这个出现在sub函数中,%s指代之前定义的mask,而“4”代表缩放比。

代码效果预览:
http://www.tudou.com/programs/view/ixTBqEH_NSo/
1

查看全部评分

Moderator

后弃

Rank: 5Rank: 5

沙发
发表于 2013-1-25 11:00:30 |只看该作者
本帖最后由 showjim 于 2013-2-4 10:50 编辑


这节主讲一些NyuFX的内置函数。
其实我不大想讲这个,因为Youka(软件作者)的想法老在变,从1.0到1.5,每次升级都把函数和用法一大变,所以我以前写的脚本就不兼容新的版本。不过希望1.5能稳定点,我还是讲下几个很有用的函数。


第二课:浅谈NyuFX Functions

NyuFX的所有内置函数可以在“Help-->Help Browser-->NyuFX function”里找到,这里也只翻译并讲些我觉得蛮有用的函数。

io.write_line(LINE)
把字幕生成到ass格式文件
  1. io.write_line(lines[1])
复制代码
最重要的函数,每个code必用!


PIXELS = convert.shape_to_pixels(SHAPE[, DOWNSCALE])
把字体信息转换成像素。保存次像素信息包括:.x(X坐标),.y(Y坐标)和.a(alpha透明信息)。
  1. local line = table.copy(lines[1])
  2. line.style = "p" --Style for pixels with f.e. \an7, \bord0, \shad0, ...
  3. local rect = shape.rectangle(1,1)
  4. for pi, pixel in ipairs( convert.shape_to_pixels("m 0 0 l 30 0 30 30 0 30") ) do
  5.         local x, y = math.round(line.left + pixel.x), math.round(line.top + pixel.y)
  6.         local alpha = (pixel.a == 255 and "") or ("\\1a" .. convert.a_to_ass(pixel.a))
  7.         line.text = string.format("{\\pos(%d,%d)%s\\p1}%s", x, y, alpha, rect)
  8.         io.write_line(line)
  9. end
复制代码
POINT = math.bezier(PERCENT, POINTS)
此函数用于计算一条任意阶贝塞尔曲线上的点,PERCENT是指百分比参量t,POINTS是所有控制点,使用例子如下:
  1. local point = math.bezier(0.3, {
  2.         {0, 0, 0},
  3.         {10, 20, -5},
  4.         {20, -20, 5},
  5.         {30, 0, 0}
  6. })
  7. print( point[1] .. " / " .. point[2] .. " / " .. point[3] )
  8. >>9 / 5.04 / -1.26
复制代码
贝赛尔曲线可以用来生成非线性移动的坐标,总体比由多条直线组成的运动平滑。


SHAPE = shape.move(SHAPE, X, Y)
按给定坐标移动图形
  1. print( shape.move("m 0 0 l 30 0 30 20 0 20", -5, 10) )
  2. >>m -5 10 l 25 10 25 30 -5 30
复制代码
这个关键字在制作Mask中会经常用到。


当然也鼓励大家自写函数,只要把Lua文件放到“includ”文件夹下就能自动加载了。
您需要登录后才可以回帖 登录 | 新人加入

GitHub|TCAX 主页

GMT+8, 2024-11-25 19:58

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部
RealH