// ============================================================================= // TEDxNingbo 开场片 · 复刻 (After Effects ExtendScript) // 参考: 烧麦/Somei 动态设计作品 (B站对比视频上画面) // 生成: 1920x1080 / 30fps / 35s 合成, 16 个段落, 与 Python 预览渲染同时间轴 // // 用法: After Effects -> 文件 -> 脚本 -> 运行脚本文件... 选择本文件 // 注意: 字体名按本机情况修改 FONT_LATIN / FONT_CJK (见下) // ============================================================================= app.beginUndoGroup("TEDx Opening Recreation"); // ---------------------------------------------------------------- 配置 var W = 1920, H = 1080, FPS = 30, DUR = 35; // 从参考片取样的主色 var NAVY = [10, 10, 77]; // 藏青 (主背景) var RED = [226, 47, 57]; // 红 var YEL = [252, 221, 29]; // 黄 var BLU = [26, 58, 226]; // 蓝 var WHT = [255, 255, 255]; var BLK = [16, 16, 16]; var ORG = [243, 124, 16]; // 橙 // 字体: 按本机可用字体修改 (Windows 常用 Arial-BoldMT / MicrosoftYaHei-Bold) var FONT_LATIN = "Arial-BoldMT"; var FONT_CJK = "MicrosoftYaHei-Bold"; var PI = "3.14159265358979323846264338327950288419716939937510" + "58209749445923078164062862089986280348253421170679" + "82148086513282306647093844609550582231725359408128" + "48111745028410270193852110555964462294895493038196"; // ---------------------------------------------------------------- 工具 function C(a) { return [a[0] / 255, a[1] / 255, a[2] / 255]; } function T(l) { return l.property("ADBE Transform Group"); } function lpos(l, v) { T(l).property("ADBE Position").setValue(v); } function lscale(l, v) { T(l).property("ADBE Scale").setValue(v); } function lrot(l, v) { T(l).property("ADBE Rotate Z").setValue(v); } function lopac(l, v) { T(l).property("ADBE Opacity").setValue(v); } function k(prop, t, v) { prop.setValueAtTime(t, v); } function kf(prop, t0, v0, t1, v1) { prop.setValueAtTime(t0, v0); prop.setValueAtTime(t1, v1); } // 给某属性的所有关键帧加缓动 function easeAll(prop, infl, outfl) { infl = (infl === undefined) ? 0.33 : infl; outfl = (outfl === undefined) ? 0.33 : outfl; for (var i = 1; i <= prop.numKeys; i++) { prop.setTemporalEaseAtKey(i, [new KeyframeEase(0, infl)], [new KeyframeEase(0, outfl)]); } } function solid(name, c, t0, t1) { var l = comp.layers.addSolid(C(c), name, W, H, 1, DUR); l.inPoint = t0; l.outPoint = t1; return l; } function shapeLayer(name, t0, t1) { var l = comp.layers.addShape(); l.name = name; l.inPoint = (t0 === undefined) ? 0 : t0; l.outPoint = (t1 === undefined) ? DUR : t1; return l; } // --- 形状组 --- function grp(layer, name) { var g = layer.property("ADBE Root Vectors Group").addProperty("ADBE Vector Group"); g.name = name; return g; } function gcont(g) { return g.property("ADBE Vectors Group"); } function gtrans(g) { return g.property("ADBE Vector Transform Group"); } function gpos(g, v) { gtrans(g).property("ADBE Vector Position").setValue(v); } function gscale(g, v) { gtrans(g).property("ADBE Vector Scale").setValue(v); } function grot(g, v) { gtrans(g).property("ADBE Vector Rotation").setValue(v); } function gopac(g, v) { gtrans(g).property("ADBE Vector Group Opacity").setValue(v); } function addRect(g, w, h) { var r = gcont(g).addProperty("ADBE Vector Shape - Rect"); r.property("ADBE Vector Rect Size").setValue([w, h]); return r; } function addEll(g, w, h) { var e = gcont(g).addProperty("ADBE Vector Shape - Ellipse"); e.property("ADBE Vector Ellipse Size").setValue([w, h]); return e; } function addStar(g, pts, outer, inner, type, rotation) { var s = gcont(g).addProperty("ADBE Vector Shape - Star"); s.property("ADBE Vector Star Type").setValue(type); // 1=星形 2=多边形 s.property("ADBE Vector Star Points").setValue(pts); s.property("ADBE Vector Star Outer Radius").setValue(outer); if (type === 1) s.property("ADBE Vector Star Inner Radius").setValue(inner); s.property("ADBE Vector Star Rotation").setValue(rotation || 0); return s; } function addPath(g, pts, closed) { var sh = gcont(g).addProperty("ADBE Vector Shape - Group"); var s = new Shape(); s.vertices = pts; s.closed = (closed === undefined) ? true : closed; sh.property("ADBE Vector Shape").setValue(s); return sh; } function fill(g, c, op) { var f = gcont(g).addProperty("ADBE Vector Graphic - Fill"); f.property("ADBE Vector Fill Color").setValue(C(c)); if (op !== undefined) f.property("ADBE Vector Fill Opacity").setValue(op); return f; } function stroke(g, c, w, op) { var s = gcont(g).addProperty("ADBE Vector Graphic - Stroke"); s.property("ADBE Vector Stroke Color").setValue(C(c)); s.property("ADBE Vector Stroke Width").setValue(w); if (op !== undefined) s.property("ADBE Vector Stroke Opacity").setValue(op); return s; } function trimPaths(g, start, end) { var t = gcont(g).addProperty("ADBE Vector Filter - Trim"); t.property("ADBE Vector Trim Start").setValue(start); t.property("ADBE Vector Trim End").setValue(end); return t; } // 线性渐变填充 (stops: [[pos,color],...]) function gradFill(g, stops, type, p0, p1) { var f = gcont(g).addProperty("ADBE Vector Graphic - G-Fill"); f.property("ADBE Vector Grad Type").setValue(type === "radial" ? 2 : 1); var arr = []; for (var i = 0; i < stops.length; i++) { var c = C(stops[i][1]); arr.push(stops[i][0], c[0], c[1], c[2]); } f.property("ADBE Vector Grad Colors").setValue(arr); f.property("ADBE Vector Grad Start Point").setValue(p0 || [-W / 2, 0]); f.property("ADBE Vector Grad End Point").setValue(p1 || [W / 2, 0]); return f; } // --- 文本 --- function textLayer(str, size, color, pos, font, just) { var l = comp.layers.addText(str); var src = l.property("ADBE Text Properties").property("ADBE Text Document"); var td = src.value; td.font = (font || FONT_LATIN); td.fontSize = size; td.fillColor = C(color); td.applyFill = true; td.justification = (just === undefined) ? ParagraphJustification.CENTER_JUSTIFY : just; src.setValue(td); lpos(l, pos); return l; } // 伪粗 (描边加粗) function bolden(layer, w, c) { var src = layer.property("ADBE Text Properties").property("ADBE Text Document"); var td = src.value; td.applyStroke = true; td.strokeColor = C(c || WHT); td.strokeWidth = w; td.strokeOverFill = false; src.setValue(td); return layer; } // 渐变文字: 文本层作 alpha 蒙版 + 全屏渐变层 function gradientText(str, size, pos, stops, font) { var matte = textLayer(str, size, WHT, pos, font); matte.name = "matte:" + str.substring(0, 12); var g = shapeLayer("grad:" + str.substring(0, 12), 0, DUR); var gg = grp(g, "gradient"); addRect(gg, W, H); gradFill(gg, stops, "linear", [-W / 2, 0], [W / 2, 0]); g.moveToBeginning(); g.trackMatteType = TrackMatteType.ALPHA; g.moveAfter(matte); return { matte: matte, grad: g }; } // ---------------------------------------------------------------- 合成 var comp = app.project.items.addComp("TEDx_Opening_Recreation", W, H, 1, DUR, FPS); comp.openInViewer(); // 主背景 (藏青) —— 最底层, 覆盖全片 var bgNavy = solid("BG_Navy", NAVY, 0, DUR); bgNavy.moveToEnd(); // ============================================================================= // S1 0.00-1.22 π 出现 // ============================================================================= (function () { var t0 = 0.00, t1 = 1.22; var l = textLayer("\u03C0", 300, YEL, [W * 0.20, H * 0.50]); l.name = "S1_Pi"; l.inPoint = t0; l.outPoint = t1; kf(lpos(l), t0, [W * 0.20, H * 0.50], t1, [W * 0.30, H * 0.50]); kf(lscale(l), t0, [55, 55], 0.75, [100, 100]); lscale(l).setValueAtTime(0.42, [104, 104]); easeAll(lscale(l)); easeAll(lpos(l)); })(); // ============================================================================= // S2 1.22-1.30 淡黄闪帧 (参考里只有 4 帧, 实测色值 #F3F2B0) // ============================================================================= (function () { var t0 = 1.22, t1 = 1.30; var fl = shapeLayer("S2_Flash", t0, t1); var g = grp(fl, "flash"); addRect(g, W, H); fill(g, [243, 242, 176]); var sc = gscale(g); k( sc, t0, [0, 100]); k( sc, 1.238, [100, 100]); k( sc, 1.268, [100, 100]); k( sc, t1, [0, 100]); easeAll(sc, 0.2, 0.2); })(); // ============================================================================= // S3 1.30-1.85 碎片聚合 (碎片很小, 参考里每个约 20px) // ============================================================================= (function () { var t0 = 1.30, t1 = 1.85; var cx = W * 0.24, cy = H * 0.52; var cols = [YEL, YEL, RED, BLU]; for (var i = 0; i < 12; i++) { var s = shapeLayer("S3_frag" + i, t0, t1); var g = grp(s, "f"); if (i % 3 === 0) addStar(g, 3, 18 + (i % 4) * 9, 9, 1, 0); else addRect(g, 20 + (i % 4) * 9, 7); fill(g, cols[i % 4]); var ang = (i / 12) * Math.PI * 2; var d = 140 + (i % 5) * 46; var sx = cx + Math.cos(ang) * d, sy = cy + Math.sin(ang) * d; gpos(g, [sx, sy]); var gp = gtrans(g).property("ADBE Vector Position"); k(gp, t0, [sx, sy]); k(gp, 1.81, [cx + Math.cos(ang) * 62, cy + Math.sin(ang) * 62]); easeAll(gp); var rp = grot(g); k(rp, t0, 0); k(rp, 1.85, 140 + i * 30); var op = gopac(g); k(op, t0, 0); k(op, t0 + 0.05, 100); } })(); // ============================================================================= // S4 1.80-6.55 π 数字流 // ============================================================================= (function () { var t0 = 1.85, t1 = 6.55; // 主数字: 逐字字距 + 加速横滚 (表达式) var matte = textLayer(PI, 560, WHT, [0, H * 0.50], FONT_LATIN, ParagraphJustification.LEFT_JUSTIFY); matte.name = "S4_PiDigits_matte"; matte.inPoint = t0; matte.outPoint = t1; // 字距收紧, 让巨大字重贴合参考 try { matte.property("ADBE Text Properties").property("ADBE Text More Options") .property("ADBE Text Tracking").setValue(-140); } catch (e) {} // 位置/缩放表达式: 加速横滚 + 1.9s 呼吸 matte.property("ADBE Transform Group").property("ADBE Position").expression = "var t = time;\n" + "var k = 0.5 + 0.5*Math.cos(2*Math.PI*(t-2.60)/1.90);\n" + "var off = 2*400*Math.pow(Math.max(0,t-1.85), 2.15);\n" + "[120 - off, " + (H * 0.50) + "];"; matte.property("ADBE Transform Group").property("ADBE Scale").expression = "var t = time;\n" + "var k = 0.5 + 0.5*Math.cos(2*Math.PI*(t-2.60)/1.90);\n" + "var s = (430 + 250*k) / 560 * 100;\n" + "[s, s];"; matte.property("ADBE Transform Group").property("ADBE Opacity").expression = "linear(time, 6.30, 6.55, 100, 0);"; // 渐变填充层 (屏幕空间黄->橙->红) var g = shapeLayer("S4_PiDigits_grad", t0, t1); var gg = grp(g, "grad"); addRect(gg, W, H); gradFill(gg, [[0, YEL], [0.30, [255, 176, 30]], [0.62, ORG], [0.88, RED], [1, RED]], "linear", [-W / 2, 0], [W / 2, 0]); g.moveToBeginning(); g.trackMatteType = TrackMatteType.ALPHA; g.moveAfter(matte); // 左侧红色小数点标记 var dot = shapeLayer("S4_Dot", t0, t1); var dg = grp(dot, "d"); addEll(dg, 26, 26); fill(dg, RED); gpos(dg, [34, H * 0.50 + 168]); grot(dg, 0); // 微型数字串 (6.32-6.55) var m2 = textLayer(PI + PI, 62, RED, [120, H * 0.50 + 10], FONT_LATIN, ParagraphJustification.LEFT_JUSTIFY); m2.name = "S4_MicroDigits"; m2.inPoint = 6.32; m2.outPoint = t1; m2.property("ADBE Transform Group").property("ADBE Position").expression = "[120 - 620*(time - 6.32), " + (H * 0.50 + 10) + "];"; var ln = shapeLayer("S4_MicroLine", 6.32, t1); var lg = grp(ln, "l"); addRect(lg, W, 5); fill(lg, RED); gpos(lg, [W / 2, H * 0.50 - 54]); gscale(lg, [100, 100]); })(); // ============================================================================= // S5 6.55-8.60 红色横条: 2 条粗条 -> 各裂成 2 条, 中央黄细线 + 微缩数字 // ============================================================================= (function () { var t0 = 6.55, t1 = 8.60; var bars = [[0.140, 0.062, 0.260, 0.125], [0.140, 0.378, 0.000, 0.135], [0.760, 0.662, 0.260, 0.120], [0.760, 0.936, 0.000, 0.135]]; for (var i = 0; i < 4; i++) { var b = bars[i]; var l = shapeLayer("S5_Bar" + i, t0, t1); var g = grp(l, "bar"); var rct = addRect(g, W, Math.max(1, b[2] * H)); fill(g, RED); var szp = rct.property("ADBE Vector Rect Size"); k(szp, 7.05, [W, Math.max(1, b[2] * H)]); k(szp, 7.75, [W, Math.max(1, b[3] * H)]); k(szp, 8.50, [W, Math.max(1, b[3] * H * 0.66)]); easeAll(szp, 0.2, 0.2); var d = (i % 2 === 0) ? 1 : -1; var gp = gtrans(g).property("ADBE Vector Position"); var startX = (d > 0) ? -W / 2 : W * 1.5; k(gp, t0, [startX, b[0] * H]); k(gp, 7.15, [W / 2, b[0] * H]); k(gp, 7.75, [W / 2, b[1] * H]); k(gp, 8.52, [W / 2, b[1] * H]); k(gp, 8.63, [(d > 0) ? W * 1.6 : -W * 0.6, b[1] * H]); easeAll(gp, 0.2, 0.2); } var ln = shapeLayer("S5_YellowLine", 6.92, 7.95); var lg = grp(ln, "l"); addRect(lg, W, 4); fill(lg, YEL); gpos(lg, [W / 2, H * 0.50]); var op = gopac(lg); k(op, 6.92, 0); k(op, 7.16, 100); k(op, 7.62, 100); k(op, 7.95, 0); var m2 = textLayer(PI + PI, 58, YEL, [120, H * 0.50 - 22], FONT_LATIN, ParagraphJustification.LEFT_JUSTIFY); m2.name = "S5_MicroDigits"; m2.inPoint = 6.92; m2.outPoint = 7.95; m2.property("ADBE Transform Group").property("ADBE Position").expression = "[120 - 640*(time - 6.92), " + (H * 0.50 - 22) + "];"; var o2 = T(m2).property("ADBE Opacity"); k(o2, 6.92, 0); k(o2, 7.16, 90); k(o2, 7.62, 90); k(o2, 7.95, 0); })(); // ============================================================================= // S6 8.60-9.60 黄环 + 橙球 // ============================================================================= (function () { var t0 = 8.60, t1 = 9.60; var cx = W * 0.335, cy = H * 0.50, R = 452; // 黄环 (描边 + 修剪路径) var l = shapeLayer("S6_Ring", t0, t1); var g = grp(l, "ring"); addEll(g, R, R); stroke(g, YEL, 36); var tp = trimPaths(g, 0, 0); gpos(g, [cx, cy]); grot(g, -90); var te = tp.property("ADBE Vector Trim End"); k(te, t0, 0); k(te, 9.35, 100); easeAll(te, 0.25, 0.25); // 刻度 (中继器) var tick = shapeLayer("S6_Ticks", t0, t1); var tg = grp(tick, "t"); var trct = addRect(tg, 4, 14); trct.property("ADBE Vector Rect Position").setValue([R / 2 + 42, 0]); fill(tg, YEL); var rep = gcont(tg).addProperty("ADBE Vector Filter - Repeater"); rep.property("ADBE Vector Repeater Copies").setValue(28); rep.property("ADBE Vector Repeater Transform").property("ADBE Vector Repeater Rotation").setValue(360 / 28); gpos(tg, [cx, cy]); var top = gtrans(tg).property("ADBE Vector Group Opacity"); k(top, t0, 0); k(top, 9.00, 100); // 橙球 (径向渐变) var b = shapeLayer("S6_Ball", t0, t1); var bg = grp(b, "ball"); addEll(bg, 200, 200); gradFill(bg, [[0, [255, 236, 120]], [0.55, [255, 170, 30]], [1, [243, 124, 16]]], "radial", [0, 0], [0, 100]); gpos(bg, [cx, cy]); var bs = gscale(bg); k(bs, 8.85, [0, 0]); k(bs, 9.30, [104, 104]); k(bs, 9.45, [100, 100]); easeAll(bs); // 右侧小方块 var sq = shapeLayer("S6_Square", 9.10, t1); var sg = grp(sq, "s"); addRect(sg, 16, 16); fill(sg, YEL); gpos(sg, [cx + R / 2 + 50, cy]); var sop = gopac(sg); k(sop, 9.10, 0); k(sop, 9.45, 100); })(); // ============================================================================= // S7 9.60-12.20 界/限 -> 无/限 (太阳) // ============================================================================= (function () { var t0 = 9.60, t1 = 12.20; // 大圆弧 var l = shapeLayer("S7_Arc", t0, t1); var g = grp(l, "arc"); addEll(g, 1400, 1400); stroke(g, YEL, 16); trimPaths(g, 0, 34); gpos(g, [W * 0.98, H * 0.52]); grot(g, 150); // 右侧刻度条 var bars = shapeLayer("S7_Ruler", 9.55, t1); var rg = grp(bars, "r"); var brc = addRect(rg, 6, H * 0.40); brc.property("ADBE Vector Rect Position").setValue([-120, 0]); fill(rg, YEL); var rep = gcont(rg).addProperty("ADBE Vector Filter - Repeater"); rep.property("ADBE Vector Repeater Copies").setValue(7); rep.property("ADBE Vector Repeater Transform").property("ADBE Vector Repeater Position").setValue([40, 0]); gpos(rg, [W * 0.855, H * 0.50]); var rop = gtrans(rg).property("ADBE Vector Group Opacity"); k(rop, 9.55, 0); k(rop, 9.95, 100); // 左上黄扇形 var fan = shapeLayer("S7_Fan", 9.50, t1); var fg = grp(fan, "f"); addStar(fg, 4, 250, 0, 2, 45); // 4 边形近似扇形 fill(fg, YEL); gpos(fg, [W * 0.10, H * 0.06]); var fop = gopac(fg); k(fop, 9.50, 0); k(fop, 9.95, 100); // 橙色太阳 var b = shapeLayer("S7_Sun", t0, t1); var bg = grp(b, "sun"); addEll(bg, 200, 200); gradFill(bg, [[0, [255, 236, 120]], [0.55, [255, 170, 30]], [1, [243, 124, 16]]], "radial", [0, 0], [0, 100]); var bp = gtrans(bg).property("ADBE Vector Position"); var bs = gscale(bg); k(bp, 9.60, [W * 0.10, H * 0.50]); k(bp, 10.60, [W * 0.17, H * 0.50]); k(bp, 11.10, [W * 0.36, H * 0.51]); k(bp, 11.80, [W * 0.20, H * 0.50]); k(bp, 12.20, [W * 0.62, H * 0.50]); easeAll(bp); k(bs, 9.60, [15, 15]); k(bs, 10.45, [340, 340]); k(bs, 11.50, [340, 340]); k(bs, 12.05, [24, 24]); easeAll(bs); // 中文: 界 -> 无 (交叉淡化), 限 由黄转红 function cjk(name, ch, y, colr, a0, a1, b0, b1) { var t = textLayer(ch, 118, colr, [W * 0.70, y], FONT_CJK); t.name = name; t.inPoint = t0; t.outPoint = t1; var op = T(t).property("ADBE Opacity"); if (a0 !== null) k(op, a0, 0); k(op, a1, 100); if (b0 !== null) { k(op, b0, 100); k(op, b1, 0); } return t; } cjk("S7_Jie", "\u754C", H * 0.42, YEL, null, 9.85, 10.42, 10.68); cjk("S7_Xian1","\u9650", H * 0.62, YEL, null, 10.15, 10.52, 10.72); cjk("S7_Wu", "\u65E0", H * 0.42, RED, 10.42, 10.80, null, null); cjk("S7_Xian2","\u9650", H * 0.62, RED, 10.52, 10.90, null, null); })(); // ============================================================================= // S8 12.20-14.00 有限 (B 形几何) // ============================================================================= (function () { var t0 = 12.20, t1 = 14.00; var cx = W * 0.28, cy = H * 0.52; // B 形: 竖线 + 上下半圆 var l = shapeLayer("S8_B", t0, t1); var vg = grp(l, "stem"); addRect(vg, 34, 340); fill(vg, YEL); gpos(vg, [cx, cy]); var u1 = grp(l, "u1"); addEll(u1, 336, 336); fill(u1, YEL); gpos(u1, [cx, cy - 84]); var u2 = grp(l, "u2"); addEll(u2, 336, 336); fill(u2, YEL); gpos(u2, [cx, cy + 84]); // 用蒙版裁掉左半边 -> 半圆 var m1 = l.property("ADBE Mask Parade").addProperty("ADBE Mask Atom"); var sh = new Shape(); sh.vertices = [[cx, cy - 260], [cx + 300, cy - 260], [cx + 300, cy + 90], [cx, cy + 90]]; sh.closed = true; m1.property("ADBE Mask Shape").setValue(sh); m1.maskMode = MaskMode.ADD; var m2 = l.property("ADBE Mask Parade").addProperty("ADBE Mask Atom"); var sh2 = new Shape(); sh2.vertices = [[cx, cy - 90], [cx + 300, cy - 90], [cx + 300, cy + 260], [cx, cy + 260]]; sh2.closed = true; m2.property("ADBE Mask Shape").setValue(sh2); m2.maskMode = MaskMode.ADD; // 整体缩放进入 var ls = T(l).property("ADBE Scale"); k(ls, t0, [0, 0]); k(ls, 12.72, [100, 100]); easeAll(ls); // 橙色球 function ball(name, x, y, d, tA, tB) { var b = shapeLayer(name, t0, t1); var bg = grp(b, "b"); addEll(bg, 200, 200); gradFill(bg, [[0, [255, 236, 120]], [0.55, [255, 170, 30]], [1, [243, 124, 16]]], "radial", [0, 0], [0, 100]); gpos(bg, [x, y]); var s = gscale(bg); k(s, tA, [0, 0]); k(s, tB, [d / 2, d / 2]); easeAll(s); return b; } ball("S8_ballA", cx + 100, cy - 82, 172, 12.45, 13.10); ball("S8_ballB", cx + 86, cy + 68, 124, 12.55, 13.20); // 两侧橙色半圆 var sl = shapeLayer("S8_SideL", t0, t1); var slg = grp(sl, "s"); addEll(slg, 450, 450); fill(slg, ORG); gpos(slg, [0, H * 0.50]); var slp = gtrans(slg).property("ADBE Vector Position"); k(slp, 12.32, [-225, H * 0.50]); k(slp, 12.87, [0, H * 0.50]); easeAll(slp); var sr = shapeLayer("S8_SideR", t0, t1); var srg = grp(sr, "s"); addEll(srg, 450, 450); fill(srg, ORG); gpos(srg, [W, H * 0.50]); var srp = gtrans(srg).property("ADBE Vector Position"); k(srp, 12.78, [W + 225, H * 0.50]); k(srp, 13.33, [W, H * 0.50]); easeAll(srp); // 有 限 + 横条 var y1 = textLayer("\u6709", 112, YEL, [W * 0.62, H * 0.42], FONT_CJK); var y2 = textLayer("\u9650", 112, YEL, [W * 0.62, H * 0.64], FONT_CJK); y1.name = "S8_You"; y2.name = "S8_Xian"; y1.inPoint = t0; y1.outPoint = t1; y2.inPoint = t0; y2.outPoint = t1; var o1 = T(y1).property("ADBE Opacity"), o2 = T(y2).property("ADBE Opacity"); k(o1, 13.05, 0); k(o1, 13.40, 100); k(o2, 13.05, 0); k(o2, 13.40, 100); var bar = shapeLayer("S8_Bar", t0, t1); var bg2 = grp(bar, "b"); addRect(bg2, 330, 9); fill(bg2, YEL); gpos(bg2, [W * 0.52 + 165, H * 0.53]); var bsc = gscale(bg2); k(bsc, 13.15, [0, 100]); k(bsc, 13.70, [100, 100]); easeAll(bsc); })(); // ============================================================================= // S9 14.00-16.40 六边形 -> 等距立方体 (底切红) // ============================================================================= (function () { var t0 = 14.00, t1 = 16.40; var cx = W * 0.50, cy = H * 0.50; // 红色底 (藏青 -> 红, 与 S10 连续) var rbg = shapeLayer("S9_RedBG", 15.28, t1); var rg = grp(rbg, "r"); addRect(rg, W, H); fill(rg, RED); var rp = gtrans(rg).property("ADBE Vector Position"); k(rp, 15.28, [-W / 2, 0]); k(rp, 15.45, [-W * 0.05, 0]); k(rp, 15.45, [-W * 0.05, 0]); k(rp, 16.45, [0, 0]); easeAll(rp, 0.2, 0.2); // 六边形描边 var hex = shapeLayer("S9_Hex", t0, t1); var hg = grp(hex, "h"); addStar(hg, 6, 584, 0, 2, 0); var hstroke = stroke(hg, RED, 16); gpos(hg, [cx, cy]); // 描边颜色随时间转白 var hsc = hstroke.property("ADBE Vector Stroke Color"); k(hsc, 14.00, C(RED)); k(hsc, 15.70, C(WHT)); // 橙球 -> 立方体 var ball = shapeLayer("S9_Ball", t0, 14.80); var bg = grp(ball, "b"); addEll(bg, 240, 240); gradFill(bg, [[0, [255, 236, 120]], [0.55, [255, 170, 30]], [1, [243, 124, 16]]], "radial", [0, 0], [0, 100]); gpos(bg, [cx, cy]); var bs = gscale(bg); k(bs, 14.15, [0, 0]); k(bs, 14.70, [100, 100]); easeAll(bs); // 等距立方体 (三个面) var cube = shapeLayer("S9_Cube", 14.75, t1); function face(name, pts, colr) { var g = grp(cube, name); addPath(g, pts, true); fill(g, colr); gpos(g, [cx, cy]); return g; } var w = 210, hh = w * 0.577, hz = 200; face("top", [[0, -hh], [w, 0], [0, hh], [-w, 0]], [255, 236, 120]); face("left", [[-w, 0], [0, hh], [0, hh + hz], [-w, hz]], WHT); face("right", [[w, 0], [0, hh], [0, hh + hz], [w, hz]], [200, 200, 210]); var csc = T(cube).property("ADBE Scale"); k(csc, 14.75, [0, 0]); k(csc, 15.15, [100, 100]); easeAll(csc); // 白线稿 var lines = shapeLayer("S9_WhiteLines", 15.70, t1); for (var k2 = 0; k2 < 2; k2++) { var lg = grp(lines, "hex" + k2); addStar(lg, 6, 420 * (1 + 0.38 * k2), 0, 2, 0); stroke(lg, WHT, 6, 0); gpos(lg, [cx, cy]); var op = gtrans(lg).property("ADBE Vector Group Opacity"); k(op, 15.70, 0); k(op, 16.30, 82); var rr = grot(lg); k(rr, 15.70, 0); k(rr, t1, k2 === 0 ? 90 : -90); } })(); // ============================================================================= // S10 16.40-19.50 三角拼贴 + 可 / 能 // ============================================================================= (function () { var t0 = 16.40, t1 = 19.50; var cy = H * 0.55; // 大三角形滑入 (顶点朝上) var blocks = [ [16.40, BLU, 1250, 840, -1500, 1, 430, null, 0], [16.75, BLK, 1050, 920, 1550, -1, 430, null, 0], [17.15, WHT, 1900, 1000, -2100, 1, 340, 17.55, 1300], [17.82, BLK, 950, 860, 1650, -1, 430, null, 0], [18.25, BLU, 820, 300, -1300, 1, 430, null, 0], [18.55, WHT, 820, 300, 1300, -1, 430, null, 0], [18.92, BLK, 700, 900, -1500, 1, 430, null, 0] ]; for (var i = 0; i < blocks.length; i++) { var b = blocks[i]; var l = shapeLayer("S10_Tri" + i, b[0], t1); var g = grp(l, "t"); addPath(g, [[0, -b[3] / 2], [b[2] / 2, b[3] / 2], [-b[2] / 2, b[3] / 2]], true); fill(g, b[1]); var gp = gtrans(g).property("ADBE Vector Position"); var startX = (b[5] > 0) ? W * 1.5 : -W * 0.5; var landX = W / 2; k(gp, b[0], [startX, cy]); k(gp, b[0] + 0.50, [landX, cy]); if (b[7] !== null) { var midT = b[7], midV = b[8]; k(gp, midT, [landX + b[5] * b[6] * (midT - b[0] - 0.50), cy]); k(gp, t1, [landX + b[5] * (b[6] * (midT - b[0] - 0.50) + midV * (t1 - midT)), cy]); } else { k(gp, t1, [landX + b[5] * b[6] * (t1 - b[0] - 0.50), cy]); } easeAll(gp, 0.2, 0.2); } // 可 / 能 var ke = textLayer("\u53EF", 104, YEL, [W * 0.255, H * 0.36], FONT_CJK); var ne = textLayer("\u80FD", 104, BLU, [W * 0.255, H * 0.56], FONT_CJK); ke.name = "S10_Ke"; ne.name = "S10_Neng"; ke.inPoint = t0; ke.outPoint = t1; ne.inPoint = t0; ne.outPoint = t1; var ok = T(ke).property("ADBE Opacity"), on = T(ne).property("ADBE Opacity"); k(ok, 17.15, 0); k(ok, 17.41, 100); k(on, 17.47, 0); k(on, 17.73, 100); })(); // ============================================================================= // S11 19.50-22.20 风车 // ============================================================================= (function () { var t0 = 19.50, t1 = 22.20; var cx = W / 2, cy = H / 2; // 8 叶片: 用星形 (8 角, 尖角) 近似 var cols = [BLU, WHT, BLU, BLK, BLK, WHT, BLU, BLK]; for (var i = 0; i < 8; i++) { var l = shapeLayer("S11_Blade" + i, t0, t1); var g = grp(l, "b"); // 一片: 从中心向外张开的四边形 addPath(g, [[0, -150], [820 * 0.42, -820 * 0.42 * 0.62], [820 * 0.62, -820 * 0.42], [0, -820 * 0.14]], true); fill(g, cols[i]); gpos(g, [cx, cy]); grot(g, i * 45); var rr = grot(g); k(rr, t0, i * 45); k(rr, t1, i * 45 + 26 * (t1 - t0)); // 出现 var sc = gscale(g); k(sc, t0, [0, 0]); k(sc, 20.05, [100, 100]); easeAll(sc); } // 白横条 + 斜十字 var bar = shapeLayer("S11_Bar", t0, t1); var bg = grp(bar, "b"); addRect(bg, 1080, 88); fill(bg, WHT); gpos(bg, [cx, cy]); for (var d = -1; d <= 1; d += 2) { var xl = shapeLayer("S11_Cross" + d, t0, t1); var xg = grp(xl, "x"); addRect(xg, 1800, 76); fill(xg, WHT); gpos(xg, [cx, cy]); grot(xg, 35 * d); var xs = gscale(xg); k(xs, t0, [0, 100]); k(xs, 20.05, [100, 100]); easeAll(xs); } // 红八边形中心 var oct = shapeLayer("S11_Oct", t0, t1); var og = grp(oct, "o"); addStar(og, 8, 400, 0, 2, 22.5); fill(og, RED); gpos(og, [cx, cy]); var os = gscale(og); k(os, t0, [0, 0]); k(os, 20.05, [100, 100]); easeAll(os); })(); // ============================================================================= // S12 22.20-23.60 六角星 // ============================================================================= (function () { var t0 = 22.20, t1 = 23.60; var cx = W / 2, cy = H / 2; var tri1 = shapeLayer("S12_TriBlack", t0, t1); var g1 = grp(tri1, "t"); addStar(g1, 3, 800, 0, 2, 0); fill(g1, BLK); stroke(g1, WHT, 9); gpos(g1, [cx, cy]); var r1 = grot(g1); k(r1, t0, 0); k(r1, t1, -15 * (t1 - t0)); var s1 = gscale(g1); k(s1, t0, [0, 0]); k(s1, 22.80, [100, 100]); easeAll(s1); var tri2 = shapeLayer("S12_TriBlue", t0, t1); var g2 = grp(tri2, "t"); addStar(g2, 3, 800, 0, 2, 0); fill(g2, BLU); stroke(g2, WHT, 9); gpos(g2, [cx, cy]); var r2 = grot(g2); k(r2, t0, 180); k(r2, t1, 180 - 15 * (t1 - t0)); var s2 = gscale(g2); k(s2, t0, [0, 0]); k(s2, 22.85, [100, 100]); easeAll(s2); // 中心蓝六边形 var hex = shapeLayer("S12_Hex", t0, t1); var hg = grp(hex, "h"); addStar(hg, 6, 320, 0, 2, 0); fill(hg, BLU); stroke(hg, WHT, 9); gpos(hg, [cx, cy]); var hs = gscale(hg); k(hs, t0, [0, 0]); k(hs, 22.90, [100, 100]); easeAll(hs); // 外圈小三角 for (var i = 0; i < 6; i++) { var st = shapeLayer("S12_Star" + i, t0, t1); var sg = grp(st, "s"); addStar(sg, 3, 128, 0, 2, 0); fill(sg, (i % 2) ? WHT : BLK); var a = -90 + i * 60; gpos(sg, [cx + Math.cos(a * Math.PI / 180) * 464, cy + Math.sin(a * Math.PI / 180) * 464]); var sr = grot(sg); k(sr, t0, a + 90); var ss = gscale(sg); k(ss, t0, [0, 0]); k(ss, 22.95, [100, 100]); easeAll(ss); } })(); // ============================================================================= // S13 23.60-25.80 转场回藏青 // ============================================================================= (function () { var t0 = 23.60, t1 = 25.80; // 红场收缩 var r = solid("S13_RedField", RED, t0, t1); var rp = T(r).property("ADBE Position"); k(rp, t0, [W / 2, H / 2]); k(rp, 24.02, [W / 2 - W * 0.5, H / 2]); easeAll(rp); // 黄色三角 (先描边后填充) var tri = shapeLayer("S13_Tri", 24.55, t1); var g = grp(tri, "t"); addStar(g, 3, 240, 0, 2, 0); stroke(g, YEL, 6); fill(g, [60, 200, 190]); gpos(g, [W * 0.30, H * 0.50]); var gs = gscale(g); k(gs, 24.55, [0, 0]); k(gs, 25.15, [100, 100]); easeAll(gs); var op = gtrans(g).property("ADBE Vector Group Opacity"); k(op, 24.55, 100); // 黄条 var bar = shapeLayer("S13_Bar", 25.15, t1); var bg = grp(bar, "b"); addRect(bg, 180, 26); fill(bg, YEL); gpos(bg, [W * 0.30, H * 0.50 + 96]); var bs = gscale(bg); k(bs, 25.15, [0, 100]); k(bs, 25.70, [100, 100]); easeAll(bs); })(); // ============================================================================= // S14 25.80-30.50 几何拼贴 + π / pài // ============================================================================= (function () { var t0 = 25.80, t1 = 30.50; var seed = 99; function rnd() { seed = (seed * 1103515245 + 12345) % 2147483648; return seed / 2147483648; } var cols = [YEL, ORG, [60, 200, 190], BLU, WHT, [150, 220, 60], RED]; // 大件 var bigs = [[0.115, 0.315, 264, ORG, 0], [0.205, 0.855, 236, ORG, 1], [0.875, 0.720, 216, [150, 220, 60], 2], [0.900, 0.220, 192, YEL, 0]]; for (var i = 0; i < bigs.length; i++) { var b = bigs[i]; var l = shapeLayer("S14_Big" + i, t0, t1); var g = grp(l, "b"); if (b[4] === 0) { addEll(g, b[2], b[2]); stroke(g, b[3], 16); } else if (b[4] === 1) { addEll(g, b[2] * 0.62, b[2] * 0.62); fill(g, b[3]); } else { addStar(g, 6, b[2], 0, 2, 0); fill(g, b[3]); } gpos(g, [b[0] * W, b[1] * H]); var rr = grot(g); k(rr, t0, 0); k(rr, t1, 20 * (t1 - t0) + i * 30); var sc = gscale(g); k(sc, t0, [50, 50]); k(sc, 26.45, [100, 100]); easeAll(sc); } // 小件 for (var j = 0; j < 30; j++) { var x = (0.06 + rnd() * 0.88) * W, y = (0.08 + rnd() * 0.84) * H; var sz = 46 + rnd() * 72, rot = rnd() * 360, spin = (rnd() - 0.5) * 140; var kind = Math.floor(rnd() * 6), cc = cols[Math.floor(rnd() * cols.length)]; var s = shapeLayer("S14_Shape" + j, t0, t1); var sg = grp(s, "s"); if (kind === 0) { addEll(sg, sz, sz); stroke(sg, cc, 7); } else if (kind === 1) { addStar(sg, 3, sz, 0, 2, 0); fill(sg, cc); } else if (kind === 2) { addStar(sg, 6, sz, 0, 2, 0); fill(sg, cc); } else if (kind === 3) { addEll(sg, sz * 0.84, sz * 0.84); fill(sg, cc); } else { addRect(sg, sz * 1.2, sz * 0.4); fill(sg, cc); } gpos(sg, [x, y]); var rp = grot(sg); k(rp, t0, rot); k(rp, t1, rot + spin * (t1 - t0)); var op = gtrans(sg).property("ADBE Vector Group Opacity"); k(op, t0, 0); k(op, 26.45, 100); } // π + pài var pi = textLayer("\u03C0", 190, YEL, [W * 0.50, H * 0.54]); var pai = textLayer("p\u00E0i", 64, WHT, [W * 0.50, H * 0.36]); pi.name = "S14_Pi"; pai.name = "S14_Pai"; pi.inPoint = t0; pi.outPoint = t1; pai.inPoint = t0; pai.outPoint = t1; var ps = T(pi).property("ADBE Scale"); k(ps, 26.10, [130, 130]); k(ps, 26.70, [100, 100]); easeAll(ps); var po = T(pi).property("ADBE Opacity"), pao = T(pai).property("ADBE Opacity"); k(po, 26.10, 0); k(po, 26.60, 100); k(pao, 26.10, 0); k(pao, 26.60, 100); // 角标 TEDxNingbo var ted = textLayer("TED", 30, RED, [W * 0.045, H * 0.055], FONT_LATIN, ParagraphJustification.LEFT_JUSTIFY); var xn = textLayer("xNingbo", 30, WHT, [W * 0.045 + 62, H * 0.055], FONT_LATIN, ParagraphJustification.LEFT_JUSTIFY); ted.name = "S14_TED"; xn.name = "S14_xNingbo"; ted.inPoint = 28.10; ted.outPoint = t1; xn.inPoint = 28.10; xn.outPoint = t1; var o1 = T(ted).property("ADBE Opacity"), o2 = T(xn).property("ADBE Opacity"); k(o1, 28.10, 0); k(o1, 28.55, 100); k(o2, 28.10, 0); k(o2, 28.55, 100); })(); // ============================================================================= // S15 30.50-33.00 字幕卡 // ============================================================================= (function () { var t0 = 30.50, t1 = 33.00; var a = textLayer("Motion", 42, WHT, [W * 0.36, H * 0.50], FONT_LATIN, ParagraphJustification.RIGHT_JUSTIFY); var b = textLayer("|", 42, WHT, [W * 0.50, H * 0.50]); var c = textLayer("Sound", 42, WHT, [W * 0.64, H * 0.50], FONT_LATIN, ParagraphJustification.LEFT_JUSTIFY); var names = ["S15_Motion", "S15_Bar", "S15_Sound"]; var arr = [a, b, c]; for (var i = 0; i < 3; i++) { arr[i].name = names[i]; arr[i].inPoint = t0; arr[i].outPoint = t1; var o = T(arr[i]).property("ADBE Opacity"); k(o, 30.60, 0); k(o, 31.05, 100); } // 详细字幕 var a2 = textLayer("Motion", 34, WHT, [W * 0.36, H * 0.50], FONT_LATIN, ParagraphJustification.RIGHT_JUSTIFY); var a3 = textLayer("@somei\u9EA6", 30, YEL, [W * 0.36, H * 0.50 + 40], FONT_CJK, ParagraphJustification.RIGHT_JUSTIFY); var x2 = textLayer("\u00D7", 34, YEL, [W * 0.50, H * 0.50 + 12]); var c2 = textLayer("Sound", 34, WHT, [W * 0.64, H * 0.50], FONT_LATIN, ParagraphJustification.LEFT_JUSTIFY); var c3 = textLayer("@\u5927\u9F13\u8BB0", 30, YEL, [W * 0.64, H * 0.50 + 40], FONT_CJK, ParagraphJustification.LEFT_JUSTIFY); var arr2 = [a2, a3, x2, c2, c3]; for (var j = 0; j < arr2.length; j++) { arr2[j].name = "S15_Detail" + j; arr2[j].inPoint = 31.60; arr2[j].outPoint = t1; var oo = T(arr2[j]).property("ADBE Opacity"); k(oo, 31.60, 0); k(oo, 32.10, 100); } })(); // ============================================================================= // S16 33.00-35.00 片尾 TEDxNingbo // ============================================================================= (function () { var t0 = 33.00, t1 = DUR; var f = 150; // 用三个文本层精确排版 TEDxNingbo var ted = textLayer("TED", f, RED, [W * 0.5 - 300, H * 0.47], FONT_LATIN, ParagraphJustification.LEFT_JUSTIFY); var x = textLayer("x", f, RED, [W * 0.5 - 40, H * 0.47], FONT_LATIN, ParagraphJustification.LEFT_JUSTIFY); var ningbo = textLayer("Ningbo", f, WHT, [W * 0.5 + 50, H * 0.47], FONT_LATIN, ParagraphJustification.LEFT_JUSTIFY); var tag = textLayer("x = independently organized TED event", 26, WHT, [W * 0.5, H * 0.47 + 96]); var group = [ted, x, ningbo]; var nm = ["S16_TED", "S16_x", "S16_Ningbo"]; for (var i = 0; i < 3; i++) { group[i].name = nm[i]; group[i].inPoint = t0; group[i].outPoint = t1; var o = T(group[i]).property("ADBE Opacity"); k(o, t0, 0); k(o, 33.55, 100); var s = T(group[i]).property("ADBE Scale"); k(s, t0, [94, 94]); k(s, 33.70, [100, 100]); easeAll(s); } tag.name = "S16_Tagline"; tag.inPoint = 33.60; tag.outPoint = t1; var to = T(tag).property("ADBE Opacity"); k(to, 33.60, 0); k(to, 34.05, 90); })(); // ---------------------------------------------------------------- 收尾 comp.time = 0; app.endUndoGroup(); alert("TEDxNingbo 开场片复刻已生成\n\n" + "合成: " + comp.name + "\n" + "尺寸: " + W + "x" + H + " / " + FPS + "fps / " + DUR + "s\n" + "图层数: " + comp.numLayers + "\n\n" + "提示: 若字体缺失, 请修改脚本顶部 FONT_LATIN / FONT_CJK 后重新运行。");