欢迎光临散文网 会员登陆 & 注册

【Aegisub】碎片字幕简单介绍

2022-02-16 23:53 作者:多华宫与火火里  | 我要投稿

        碎片字幕其实是很简单的东西,本来没打算写专栏的,因为实在很简单

        首先之前讲过绘图与绘图求交集的函数,那么当然这就可以用来做碎片字幕。先简单设定一下什么叫碎片,就是将原来的绘图拆成多个部分,每个部分就叫一个碎片,所以这些碎片拼起来就能得到原来的绘图。

        那么比如要做文字碎片,就需要把一个文字变成很多块碎片,那每一块碎片怎么来的呢,当然就是和文字绘图进行一次取交得到的,对吧,这很容易想到,可以说这是非常自然的思考,所以才说这很简单...

        然后就是怎么保证一次次的取交以后得到的碎片能刚好拼成这个文字绘图了。先计算得到绘图的bbox边界框,这样绘图就必然包含在这个bbox边界框内了,比如图1.01

图1.01

然后就可以把这个矩形框分成很多块,比如图1.02

图1.02

比如像图1.02这样分成13块,那么你就可以拿这13块碎片和文字绘图一次次的做取交操作、一共做13次,那么得到的13个碎片不就可以刚好拼成文字绘图了吗,而分割矩形的方式有很多种,比如你可以分成图1.03、图1.04这些样子

图1.03
图1.04

当然之前讲过三角网生成算法的,也讲过泰森多边形的生成算法的,那当然矩形就可以直接弄成一张三角网,比如图1.05,然后就可以做碎片了不是吗

图1.05

或者把矩形分成一堆泰森多边形,如图1.06

图1.06

这样就能做出各种样子的碎片了。然后还有一点就是,需要定位,什么意思呢,就是比如你有图1.07这么个文字绘图

图1.07

(图1.07绘图代码为m 15 1 l 16 1 l 18 1 l 20 2 l 21 3 l 21 5 l 21 6 l 19 7 l 18 7 l 18 6 l 17 5 l 16 3 l 15 1 m 5 4 l 6 4 l 7 6 l 31 6 l 31 6 l 32 4 l 33 4 l 37 9 l 37 9 l 35 9 l 35 9 l 34 9 l 33 10 l 31 11 l 29 13 l 28 13 l 30 8 l 7 8 l 7 10 l 6 13 l 4 14 l 3 14 l 2 13 l 2 11 l 3 10 l 4 8 l 5 7 l 5 4 m 26 11 l 27 11 l 30 15 l 30 16 l 28 16 l 26 17 l 24 18 l 22 19 l 22 19 l 22 20 l 21 21 l 21 22 l 31 22 l 33 19 l 34 19 l 35 21 l 37 22 l 37 24 l 21 24 l 21 26 l 21 35 l 20 36 l 19 37 l 17 38 l 16 38 l 15 35 l 14 34 l 12 34 l 12 33 l 15 33 l 17 33 l 17 33 l 17 24 l 4 24 l 4 24 l 3 24 l 2 22 l 17 22 l 17 21 l 17 17 l 19 18 l 20 19 l 21 17 l 24 15 l 9 15 l 8 15 l 8 15 l 6 13 l 25 13 l 25 13 l 26 11 )

然后你拿图1.08这个绘图去取交(重叠部分利用图1.09可以看得很清楚)

图1.08

(图1.08的绘图代码是m 10 17 l 38 26 l 30 43 l 7 38 )

图1.09

然后取交后就得到一个碎片,如图1.10

图1.10

(图1.10的绘图代码是m 22 21 l 21 21 l 21 22 l 26 22 l 31 24 l 21 24 l 21 26 l 21 35 l 20 36 l 19 37 l 17 38 l 16 38 l 15 35 l 14 34 l 12 34 l 12 33 l 15 33 l 17 33 l 17 33 l 17 24 l 9 24 l 9 22 l 17 22 l 17 21 l 17 19)

那么显然这个绘图的"中心"不在(0,0)点,这意味这什么呢,假设你直接这么用这个绘图,然后用比如\frz做旋转效果,那当然绘图旋转的中心是(0,0)点,而(0,0)点又不是绘图的"中心",那旋转的样子可能就不好看了,像公转一样。所以就需要平移这个绘图,使得绘图的中心在(0,0)点,这样旋转的时候就是绕着这个碎片的"中心"旋转了,如图1.11

图1.11

那么怎么将碎片平移到"中心"大概在原点呢,当然就是bounding了,求出这个碎片的bbox边界框的中心点(x,y),然后碎片水平方向平移 -x、竖直方向平移 -y不就行了。所以你想啊,现在所有的碎片都因为要平移使其"中心"在原点,那么这个时候你直接看不就是所有碎片重在一起了吗,比如图1.12和图1.11如果重在一起就是图1.13了

图1.12
图1.13

所以这里就需要用到定位了,也就是改变pos的数字嘛,众所周知,你这个碎片绘图不管在assdraw里的位置是怎样,你\pos的数字不同,就可以让你的绘图处于屏幕中不同的位置,比如你\pos(233,66)和你\pos(666,740)当然就有不同,所以这里因为要让碎片们刚好拼成文字绘图,就需要知道每个碎片在从原来位置平移到(0,0)点是平移了多少,也就是刚刚说的,计算了bbox的中心是(cx,cy),所以为了让bbox中心在(0,0)就要让绘图x方向平移 -cx、然后y方向平移 -cy,所以说,如果要pos定位的话,再加上相应的x、y即可,比如\pos(!233+cx!,!66+cy!)不就行了吗(就像比如你做像素特效的时候,不是会用诸如\pos(!$left+px[j].x!,!$top+px[j].y!)此类的东西吗)...我觉得我讲得无比清楚了,没有任何理由这么简单的东西不理解的,就像文章一开始讲的,碎片字幕因为实在是很简单、很基础,所以我很懒得讲。。。

        还有当然,做碎片只需要保证那些碎片能拼成原本的绘图即可,所以也不是一定要用分割绘图的bbox边界框的方法来获得碎片,比如你可以像图1.14一样,用这样4块碎片去和文字绘图取交也一样,得到的碎片们照样能拼成原来的绘图

图1.14

那么当然图1.15这样也可以

图1.15  (就当我手残)

        像这些东西我觉得不用讲也应该知道...

【Aegisub】碎片字幕简单介绍的评论 (共 条)

分享到微博请遵守国家法律