Remotion LabRemotion Lab
返回模板庫

三角碎片拼合抽象 Logo

三個彩色三角形碎片(藍、紫、青)各自從畫面外不同方向以 spring 彈飛入,stagger 12 幀逐一落定,拼合成完整等邊三角形,中央倒三角負空間隨後縮放顯現,形成幾何品牌圖標,品牌名與標語最後依序浮入。適合科技、設計或建築類品牌。

Logo動畫品牌三角形幾何碎片Spring動畫
提示詞(可直接修改內容)
import React from "react";
import {
  AbsoluteFill,
  interpolate,
  spring,
  useCurrentFrame,
  useVideoConfig,
} from "remotion";

export const LogoTriangleForm: React.FC = () => {
  const frame = useCurrentFrame();
  const { fps } = useVideoConfig();

  // 大三角形等邊,高 220px,中心約 960, 430
  // 頂點:頂部 (960, 320);左下 (833, 540);右下 (1087, 540)
  // 四個小三角形組成:
  // 左下小三角:(833,540) (960,540) (896,430) → 藍色
  // 右下小三角:(960,540) (1087,540) (1024,430) → 紫色
  // 頂部小三角:(896,430) (1024,430) (960,320) → 青色
  // 中央倒三角(負空間):(896,430) (1024,430) (960,540) → 背景色

  // spring helper:對每個三角形計算 spring 進度
  const makeSpring = (startFrame: number) =>
    spring({
      frame: frame - startFrame,
      fps,
      config: { damping: 18, stiffness: 120, mass: 1 },
      durationInFrames: 40,
    });

  // 各三角形 spring 進度(stagger 12 幀)
  const prog0 = makeSpring(0);  // 左下
  const prog1 = makeSpring(12); // 右下
  const prog2 = makeSpring(24); // 頂部

  // 左下三角:從 (-300, 200) → (0, 0)
  const blTx = interpolate(prog0, [0, 1], [-300, 0]);
  const blTy = interpolate(prog0, [0, 1], [200, 0]);

  // 右下三角:從 (300, 200) → (0, 0)
  const brTx = interpolate(prog1, [0, 1], [300, 0]);
  const brTy = interpolate(prog1, [0, 1], [200, 0]);

  // 頂部三角 Y 軸偏移(從 -300 飛入 0)
  const topTriY = interpolate(prog2, [0, 1], [-300, 0]);

  // frame 60-90:中央倒三角(負空間)scale 0→1
  const negTriScale = interpolate(frame, [60, 90], [0, 1], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  });

  // frame 80-105:品牌名 y:+30→0,opacity 0→1
  const brandY = interpolate(frame, [80, 105], [30, 0], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  });
  const brandOpacity = interpolate(frame, [80, 105], [0, 1], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  });

  // frame 100-120:副標語淡入
  const taglineOpacity = interpolate(frame, [100, 120], [0, 1], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  });

  return (
    <AbsoluteFill
      style={{
        background: "#0f0f0f",
        justifyContent: "center",
        alignItems: "center",
      }}
    >
      <svg
        width="1920"
        height="1080"
        viewBox="0 0 1920 1080"
        style={{ position: "absolute", top: 0, left: 0 }}
      >
        {/* 左下小三角(藍色):從左下飛入 */}
        <polygon
          points="833,540 960,540 896,430"
          fill="#3b82f6"
          transform={`translate(${blTx}, ${blTy})`}
        />

        {/* 右下小三角(紫色):從右下飛入 */}
        <polygon
          points="960,540 1087,540 1024,430"
          fill="#8b5cf6"
          transform={`translate(${brTx}, ${brTy})`}
        />

        {/* 頂部小三角(青色):從頂部飛入 */}
        <polygon
          points="896,430 1024,430 960,320"
          fill="#06b6d4"
          transform={`translate(0, ${topTriY})`}
        />

        {/* 中央倒三角(負空間,背景色):scale 0→1 */}
        <polygon
          points="896,430 1024,430 960,540"
          fill="#0f0f0f"
          transform={`translate(960, 485) scale(${negTriScale}) translate(-960, -485)`}
        />
      </svg>

      {/* 品牌名與副標語 */}
      <div
        style={{
          position: "absolute",
          top: 570,
          left: 0,
          right: 0,
          display: "flex",
          flexDirection: "column",
          alignItems: "center",
          gap: 16,
        }}
      >
        <div
          style={{
            opacity: brandOpacity,
            transform: `translateY(${brandY}px)`,
          }}
        >
          <span
            style={{
              fontSize: 44,
              fontWeight: 800,
              color: "#ffffff",
              fontFamily: "sans-serif",
              letterSpacing: "-0.02em",
              whiteSpace: "nowrap",
            }}
          >
            Triform
          </span>
        </div>

        <div
          style={{
            opacity: taglineOpacity,
          }}
        >
          <span
            style={{
              fontSize: 20,
              fontWeight: 400,
              color: "#6b7280",
              fontFamily: "sans-serif",
              letterSpacing: "0.04em",
              whiteSpace: "nowrap",
            }}
          >
            Built to last.
          </span>
        </div>
      </div>
    </AbsoluteFill>
  );
};

登入後查看完整程式碼