Remotion LabRemotion Lab
返回模板庫

軌道聚合 Logo 揭示

三個彩色圓點繞中心軌道旋轉,隨後向中心聚合消失,漸層圓形圖標彈入,品牌名稱與副標語依序登場。動態感十足,適合科技與動態設計品牌。

Logo動畫品牌軌道圓點漸層
提示詞(可直接修改內容)
import React from "react";
import {
  AbsoluteFill,
  interpolate,
  spring,
  useCurrentFrame,
  useVideoConfig,
} from "remotion";

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

  // 中央圖標 scale 0→1(frame 0-35),spring
  const iconScale = spring({
    frame,
    fps,
    config: { damping: 20, stiffness: 160 },
    durationInFrames: 35,
  });

  // 軌道圓點顏色
  const dotColors = ["#3b82f6", "#8b5cf6", "#ec4899"];

  // 軌道半徑:frame 0-50 時 100px,frame 50-75 時從 100→0
  const orbitRadius = interpolate(
    frame,
    [0, 50, 75],
    [100, 100, 0],
    {
      extrapolateLeft: "clamp",
      extrapolateRight: "clamp",
    }
  );

  // 圓點 opacity:frame 60-75 從 1→0
  const dotOpacity = interpolate(frame, [60, 75], [1, 0], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  });

  // 品牌名「Vertex」spring 入場(frame 70-100)
  const brandY = interpolate(frame, [70, 100], [30, 0], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  });
  const brandOpacity = interpolate(frame, [70, 100], [0, 1], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  });

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

  // 計算 3 個軌道圓點的位置(不使用 Math.random)
  const dots = dotColors.map((color, i) => {
    const baseAngle = i * ((2 * Math.PI) / 3);
    const angle = baseAngle + frame * 0.06;
    const x = 960 + Math.cos(angle) * orbitRadius;
    const y = 540 + Math.sin(angle) * orbitRadius;
    return { x, y, color };
  });

  return (
    <AbsoluteFill
      style={{
        background: "#0f0f0f",
        justifyContent: "center",
        alignItems: "center",
      }}
    >
      {/* 軌道圓點(SVG) */}
      <svg
        width="1920"
        height="1080"
        viewBox="0 0 1920 1080"
        style={{ position: "absolute", top: 0, left: 0 }}
      >
        {dots.map((dot, i) => (
          <circle
            key={i}
            cx={dot.x}
            cy={dot.y}
            r={7}
            fill={dot.color}
            opacity={dotOpacity}
          />
        ))}
      </svg>

      {/* 中央圖標 */}
      <div
        style={{
          position: "absolute",
          left: 960 - 60,
          top: 540 - 60,
          width: 120,
          height: 120,
          borderRadius: "50%",
          background: "linear-gradient(135deg, #6366f1, #8b5cf6)",
          display: "flex",
          justifyContent: "center",
          alignItems: "center",
          transform: `scale(${iconScale})`,
        }}
      >
        <span
          style={{
            fontSize: 60,
            fontWeight: 700,
            color: "#ffffff",
            fontFamily: "sans-serif",
            lineHeight: 1,
          }}
        >
          V
        </span>
      </div>

      {/* 品牌名 + 副標語,垂直居中在圖標正下方 */}
      <div
        style={{
          position: "absolute",
          top: 540 + 80,
          left: 0,
          right: 0,
          display: "flex",
          flexDirection: "column",
          alignItems: "center",
          gap: 12,
        }}
      >
        {/* 品牌名 */}
        <div
          style={{
            fontSize: 52,
            fontWeight: 700,
            color: "#ffffff",
            fontFamily: "sans-serif",
            letterSpacing: "-0.02em",
            opacity: brandOpacity,
            transform: `translateY(${brandY}px)`,
          }}
        >
          Vertex
        </div>

        {/* 副標語 */}
        <div
          style={{
            fontSize: 22,
            fontWeight: 400,
            color: "#6b7280",
            fontFamily: "sans-serif",
            letterSpacing: "0.05em",
            opacity: taglineOpacity,
          }}
        >
          Motion by design.
        </div>
      </div>
    </AbsoluteFill>
  );
};

登入後查看完整程式碼