Remotion LabRemotion Lab
返回模板庫

品牌裝飾剝除:價值還剩什麼?

先展示一張華麗的品牌卡片,接著將裝飾元素逐一剝除,最後只剩光禿禿的 Logo 與問號,叩問品牌的核心價值。

品牌動畫剝除效果問號
提示詞(可直接修改內容)
import React from "react";
import {
  AbsoluteFill,
  useCurrentFrame,
  useVideoConfig,
  interpolate,
  spring,
} from "remotion";

const colors = {
  background: "#0A0E14",
  backgroundGradient: "linear-gradient(135deg, #0A0E14 0%, #131A24 100%)",
  accentSecondary: "#4DA3FF",
  warning: "#FFB547",
};
const fonts = { main: "'Inter', 'Noto Sans TC', sans-serif" };

const decFade = (frame: number, startOut: number, endOut: number): number =>
  interpolate(frame, [startOut, endOut], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });

export const BRAND-VALUE-LEFT-DURATION-FRAMES = 210;

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

  const cardSpring = spring({ frame: Math.max(0, frame - 5), fps, config: { damping: 12, mass: 0.6, stiffness: 100 } });
  const cardScale = interpolate(cardSpring, [0, 1], [0.25, 1]);
  const cardOpacity = interpolate(cardSpring, [0, 0.3], [0, 1], { extrapolateRight: "clamp" });

  const deco0 = decFade(frame, 65, 76);
  const deco1 = decFade(frame, 70, 80);
  const deco2 = decFade(frame, 74, 85);
  const deco3 = decFade(frame, 79, 90);
  const deco4 = decFade(frame, 83, 93);
  const deco5 = decFade(frame, 87, 98);
  const deco6 = decFade(frame, 91, 102);
  const deco7 = decFade(frame, 95, 106);
  const deco8 = decFade(frame, 99, 110);

  const phase12Opacity = interpolate(frame, [105, 130], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
  const coreOpacity = interpolate(frame, [108, 130], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });

  const qSpring = spring({ frame: Math.max(0, frame - 118), fps, config: { damping: 14, mass: 0.8, stiffness: 90 } });
  const qScale = interpolate(qSpring, [0, 1], [0, 1]);
  const qOpacity = interpolate(qSpring, [0, 0.25], [0, 1], { extrapolateRight: "clamp" });
  const subtitleOpacity = interpolate(frame, [148, 168], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
  const qPulse = frame > 130 ? interpolate(Math.sin((frame - 130) * 0.05), [-1, 1], [0.88, 1.0]) : 1;
  const fadeOut = interpolate(frame, [185, 210], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });

  return (
    <AbsoluteFill style={{ background: colors.backgroundGradient }}>
      <AbsoluteFill style={{ display: "flex", alignItems: "center", justifyContent: "center", opacity: fadeOut }}>
        {phase12Opacity > 0 && (
          <div style={{ position: "absolute", display: "flex", alignItems: "center", justifyContent: "center", opacity: cardOpacity * phase12Opacity, transform: `scale(${cardScale})` }}>
            <svg width="840" height="600" viewBox="0 0 560 400">
              <defs>
                <linearGradient id="bvlCardGrad" x1="0" y1="0" x2="1" y2="1">
                  <stop offset="0%" stopColor="#6B48FF" stopOpacity="0.55" />
                  <stop offset="50%" stopColor={colors.accentSecondary} stopOpacity="0.4" />
                  <stop offset="100%" stopColor="#FF6BAA" stopOpacity="0.5" />
                </linearGradient>
                <linearGradient id="bvlBorderGrad" x1="0" y1="0" x2="1" y2="1">
                  <stop offset="0%" stopColor="#6B48FF" />
                  <stop offset="50%" stopColor={colors.accentSecondary} />
                  <stop offset="100%" stopColor="#FF6BAA" />
                </linearGradient>
              </defs>
              <circle cx="280" cy="200" r="188" fill="none" stroke="url(#bvlBorderGrad)" strokeWidth="1.5" strokeDasharray="6 4" opacity={deco8 * 0.55} />
              <rect x="60" y="80" width="440" height="240" rx="20" fill="#0D1420" />
              <rect x="60" y="80" width="440" height="240" rx="20" fill="url(#bvlCardGrad)" opacity={deco1} />
              <rect x="60" y="80" width="440" height="240" rx="20" fill="none" stroke="url(#bvlBorderGrad)" strokeWidth="3" opacity={deco2} />
              <circle cx="280" cy="178" r="30" fill="rgba(255,255,255,0.08)" stroke="rgba(255,255,255,0.18)" strokeWidth="1.5" />
              <text x="280" y="188" fontSize="28" fontFamily={fonts.main} fill="rgba(255,255,255,0.75)" textAnchor="middle" fontWeight="700">B</text>
              <text x="280" y="230" fontSize="18" fontFamily={fonts.main} fill="rgba(255,255,255,0.55)" textAnchor="middle" fontWeight="400" letterSpacing="4">BRAND</text>
              {[{ cx: 60, cy: 80 }, { cx: 500, cy: 80 }, { cx: 60, cy: 320 }, { cx: 500, cy: 320 }].map((pos, i) => (
                <g key={i} transform={`translate(${pos.cx}, ${pos.cy})`} opacity={deco3}>
                  <rect x="-8" y="-8" width="16" height="16" rx="2" fill="none" stroke="url(#bvlBorderGrad)" strokeWidth="1.5" transform="rotate(45)" />
                  <circle cx="0" cy="0" r="2.5" fill={colors.accentSecondary} opacity={0.7} />
                </g>
              ))}
              <g opacity={deco5}>
                <rect x="86" y="252" width="110" height="22" rx="11" fill="rgba(107,72,255,0.35)" stroke="rgba(107,72,255,0.6)" strokeWidth="1" />
                <text x="141" y="267" fontSize="10" fontFamily={fonts.main} fill="rgba(255,255,255,0.85)" textAnchor="middle" fontWeight="600">PREMIUM</text>
              </g>
              <g opacity={deco7} transform={`translate(280, 340)`}>
                <circle cx="0" cy="0" r="4" fill={colors.accentSecondary} opacity={0.7} />
              </g>
            </svg>
          </div>
        )}

        {coreOpacity > 0 && (
          <div style={{ position: "absolute", display: "flex", flexDirection: "column", alignItems: "center", gap: 0, opacity: coreOpacity }}>
            <div style={{ display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", width: 270, height: 180, borderRadius: 16, background: "rgba(255,255,255,0.04)", border: "1.5px solid rgba(255,255,255,0.1)", marginBottom: 72 }}>
              <div style={{ width: 66, height: 66, borderRadius: "50%", background: "rgba(255,255,255,0.07)", border: "1.5px solid rgba(255,255,255,0.15)", display: "flex", alignItems: "center", justifyContent: "center", marginBottom: 15 }}>
                <span style={{ fontSize: 33, fontWeight: 700, fontFamily: fonts.main, color: "rgba(255,255,255,0.55)" }}>B</span>
              </div>
              <span style={{ fontSize: 19, fontWeight: 400, fontFamily: fonts.main, color: "rgba(255,255,255,0.35)", letterSpacing: 4 }}>品牌</span>
            </div>

            {qOpacity > 0 && (
              <div style={{ opacity: qOpacity, transform: `scale(${qScale * qPulse})`, marginBottom: 42 }}>
                <span style={{ fontSize: 165, fontWeight: 300, fontFamily: fonts.main, color: "rgba(255,255,255,0.22)", lineHeight: 1, display: "block" }}>?</span>
              </div>
            )}

            {subtitleOpacity > 0 && (
              <div style={{ opacity: subtitleOpacity * 0.75, display: "flex", flexDirection: "column", alignItems: "center", gap: 15 }}>
                <span style={{ fontSize: 42, fontWeight: 400, fontFamily: fonts.main, color: "rgba(255,255,255,0.6)", letterSpacing: 2 }}>價值還剩什麼?</span>
              </div>
            )}
          </div>
        )}
      </AbsoluteFill>
    </AbsoluteFill>
  );
};

登入後查看完整程式碼