前言

After a rough morning of finishing a test and failing m […]
The Venetian Blinds Enigma
以上是lachrymaL的思路。
以下是我的思路。
(无公式预警)
一、一些关于百叶窗效果预备知识
- AE的百叶窗默认从正中心(中间)开始;
- 百叶窗的“方向”是表示从+y方向顺时针转过的角度;
- 百叶窗的“过渡完成”是反过来的,打个比方,如果角度是45°,那么从0%到100%的过渡完成是从左上向右下扫过去的;
- 百叶窗的“宽度”指的是100%“过渡完成”下“方向”法向的长度;
- 在表达式中,AE默认使用的角度用的弧度制。
二、制作思路
先把之后会用到的各个量提前表示出来(注意大小写):
注意在下面一个特殊说明以前,全部不是正规的表达式写法。
对于百叶窗的施加体:
Position , HEIGHT , WIDTH
p.x = Position.x , p.y = Postion.y
h = HEIGHT , w = WIDTH
对于百叶窗效果:
angle , width
a = angle , dw = width
在表达式中出现的:
不定整数 l = lambda
表示为l1 , l2 等
边计数 sc = SideCount
开始制作(无图请脑补)
首先尝试水平对齐。
在每一个框中,由过中心侧出发(如0 ~ 90° 时为右侧)的线与底部的交点应该是:
x = 0.5 * w – 0.5 * h * tana + l1 * dwx * seca
其中dwx用来表示水平两个窗叶同侧的水平距离差,区别于dw;由数学知识很容易得到:
dwx = w * seca 或者是 dwx = w / cosa
同样的,与上部的交点应该是:
x = 0.5 * w + 0.5h * tana + l2 * dwx * seca
为了方便起见,取合成同样大小的水平相邻的两个矩形(中心+右侧的一个)。
它们与下部的交点应该是:
中心 x1 ∈ [0,w] | x1 = 0.5 * w – 0.5 * h * tana + l1 * dwx * seca , l1 ∈ Z
右侧 x2 ∈ [w,2w] | x2 = 1.5 * w – 0.5 * h * tana + l2 * dwx * seca , l2 ∈ Z
若要两个图像能够无缝隙,那么x1的延伸要与x2重合,即在不考虑值域的情况下可以有x1 = x2。
于是我们得到:
w * tana = (l1 – l2) * dwx * seca
用几何方法容易验证其正确性。
进一步代入化简,并用sc代替(l1 – l2),得到一个简洁的公式:
dw = w * sina / sc
sc在这里是一个正整数。
因此,在仅保证水平对齐的情况下,可以这样按照这样的思路去写表达式:
- 创建一个滑杆控制(Slider Control),命名为SideCount;和一个角控制(Angle Control),命名为Direction
- 在百叶窗面板中链接Direction到“方向”(Direction)
-
在“宽度”(Width)一栏键入表达式,按以下规则:用sc链接滑杆控制的值,a链接角控制的值,在最后一行写下
this.width * Math.sin(a * Math.PI / 180) / sc
类似地,我们可以推导出仅垂直对齐的公式:
dw = w * cosa / sc
并且用类似的方法去写表达式。
三、杂言
希望水平垂直都对齐吗?那么你需要解一个不定方程并得到整数解,这是很难做到的,况且本方法其实已经有些复杂。
从使用价值的角度来考虑,其实还是蛮推荐MMaker的其他方案。如果不是想玩猴子排序那样的东西的话,研究这种东西大概也只是浪费时间罢了。
留下评论