Remotion LabRemotion Lab
返回模板庫

致命的兩個錯誤詳解

依序展示兩個致命錯誤:①痛點有問題——分析報告疊上大紅問號;②Distribution 不深——訊號弱的喇叭只觸及到一個人,其餘全是 X 標記。

錯誤診斷痛點Distribution
提示詞(可直接修改內容)
import React from "react";
import {
  AbsoluteFill,
  useCurrentFrame,
  useVideoConfig,
  interpolate,
  spring,
} from "remotion";

const fonts = { main: "'Noto Sans TC', 'Inter', sans-serif" };

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

  const fadeIn = interpolate(frame, [0, 8], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
  const fadeOut = interpolate(frame, [280, 300], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
  const masterOpacity = Math.min(fadeIn, fadeOut);

  const e1NumSpring = spring({ frame: Math.max(0, frame - 10), fps, config: { damping: 10, stiffness: 110 } });
  const e1TitleSpring = spring({ frame: Math.max(0, frame - 18), fps, config: { damping: 12, stiffness: 90 } });
  const e1IconSpring = spring({ frame: Math.max(0, frame - 30), fps, config: { damping: 10, stiffness: 100 } });
  const e1QmarkSpring = spring({ frame: Math.max(0, frame - 50), fps, config: { damping: 8, stiffness: 120 } });
  const e1Fade = interpolate(frame, [145, 160], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });

  const e2NumSpring = spring({ frame: Math.max(0, frame - 155), fps, config: { damping: 10, stiffness: 110 } });
  const e2TitleSpring = spring({ frame: Math.max(0, frame - 163), fps, config: { damping: 12, stiffness: 90 } });
  const e2IconSpring = spring({ frame: Math.max(0, frame - 175), fps, config: { damping: 10, stiffness: 100 } });
  const e2WaveFrame = Math.max(0, frame - 190);

  const qWobble = frame > 55 ? Math.sin(frame * 0.12) * 6 : 0;

  return (
    <AbsoluteFill style={{ background: "linear-gradient(135deg, #0A0E14 0%, #111825 100%)", opacity: masterOpacity }}>
      <AbsoluteFill style={{ opacity: e1Fade, display: "flex", alignItems: "center", justifyContent: "center", fontFamily: fonts.main }}>
        <div style={{ display: "flex", flexDirection: "column", alignItems: "center", maxWidth: 2100 }}>
          <div style={{ display: "flex", alignItems: "center", gap: 36, marginBottom: 24 }}>
            <div style={{ opacity: e1NumSpring, transform: `scale(${e1NumSpring})`, width: 96, height: 96, borderRadius: "50%", background: "#EF4444", display: "flex", alignItems: "center", justifyContent: "center", fontSize: 51, fontWeight: 800, color: "#FFFFFF", flexShrink: 0 }}>1</div>
            <div style={{ opacity: e1TitleSpring, transform: `translateX(${(1 - e1TitleSpring) * 30}px)`, fontSize: 78, fontWeight: 700, color: "#FFFFFF", lineHeight: 1.3 }}>痛點有問題</div>
          </div>
          <div style={{ opacity: e1TitleSpring * 0.5, fontSize: 42, color: "rgba(255,255,255,0.45)", marginBottom: 75, fontFamily: "'Inter', sans-serif" }}>
            The pain point itself is questionable
          </div>
          <div style={{ position: "relative", opacity: e1IconSpring, transform: `scale(${e1IconSpring})` }}>
            <svg width={540} height={480} viewBox="0 0 360 320">
              <rect x={100} y={20} width={160} height={210} rx={12} fill="rgba(239,68,68,0.08)" stroke="#EF4444" strokeWidth={3} />
              <line x1={130} y1={70} x2={230} y2={70} stroke="#F87171" strokeWidth={3} strokeLinecap="round" opacity={0.4} />
              <line x1={130} y1={100} x2={210} y2={100} stroke="#F87171" strokeWidth={3} strokeLinecap="round" opacity={0.3} />
              <line x1={130} y1={130} x2={220} y2={130} stroke="#F87171" strokeWidth={3} strokeLinecap="round" opacity={0.3} />
              <line x1={130} y1={160} x2={190} y2={160} stroke="#F87171" strokeWidth={3} strokeLinecap="round" opacity={0.2} />
              <rect x={130} y={175} width={20} height={30} rx={3} fill="#F87171" opacity={0.3} />
              <rect x={158} y={185} width={20} height={20} rx={3} fill="#F87171" opacity={0.25} />
              <rect x={186} y={170} width={20} height={35} rx={3} fill="#F87171" opacity={0.3} />
              <g opacity={e1QmarkSpring} transform={`translate(${180 + qWobble}, 135) scale(${e1QmarkSpring})`}>
                <circle cx={0} cy={0} r={70} fill="rgba(239,68,68,0.15)" />
                <text x={0} y={12} textAnchor="middle" dominantBaseline="central" fontSize={100} fontWeight={900} fill="#EF4444" fontFamily="'Inter', sans-serif">?</text>
              </g>
              <text x={180} y={265} textAnchor="middle" fontSize={22} fill="rgba(255,255,255,0.4)" fontFamily="'Noto Sans TC', sans-serif">「分析點子產出報告」</text>
            </svg>
          </div>
        </div>
      </AbsoluteFill>

      {frame >= 150 && (
        <AbsoluteFill style={{ opacity: e2NumSpring, display: "flex", alignItems: "center", justifyContent: "center", fontFamily: fonts.main }}>
          <div style={{ display: "flex", flexDirection: "column", alignItems: "center", maxWidth: 2100 }}>
            <div style={{ display: "flex", alignItems: "center", gap: 36, marginBottom: 24 }}>
              <div style={{ opacity: e2NumSpring, transform: `scale(${e2NumSpring})`, width: 96, height: 96, borderRadius: "50%", background: "#EF4444", display: "flex", alignItems: "center", justifyContent: "center", fontSize: 51, fontWeight: 800, color: "#FFFFFF", flexShrink: 0 }}>2</div>
              <div style={{ opacity: e2TitleSpring, transform: `translateX(${(1 - e2TitleSpring) * 30}px)`, fontSize: 78, fontWeight: 700, color: "#FFFFFF", lineHeight: 1.3 }}>Distribution 不深</div>
            </div>
            <div style={{ opacity: e2TitleSpring * 0.5, fontSize: 42, color: "rgba(255,255,255,0.45)", marginBottom: 75, fontFamily: "'Inter', sans-serif" }}>
              Distribution is too shallow to reach enough people
            </div>
            <div style={{ opacity: e2IconSpring, transform: `scale(${e2IconSpring})` }}>
              <svg width={750} height={420} viewBox="0 0 500 280">
                <g transform="translate(100, 130)" opacity={0.7}>
                  <path d="M -12 -20 L 28 -36 L 28 36 L -12 20 Z" fill="#EF4444" opacity={0.6} />
                  <rect x={-22} y={-14} width={12} height={28} rx={3} fill="#F87171" opacity={0.5} />
                </g>
                {[0, 1, 2, 3].map((j) => {
                  const waveDelay = j * 8;
                  const waveOp = interpolate(e2WaveFrame - waveDelay, [0, 15, 30], [0, 0.5 - j * 0.12, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
                  const waveR = 50 + j * 40;
                  return (
                    <path key={j} d={`M ${140 + j * 40} ${130 - waveR * 0.5} Q ${140 + j * 40 + 15} 130 ${140 + j * 40} ${130 + waveR * 0.5}`} fill="none" stroke="#EF4444" strokeWidth={3 - j * 0.5} strokeLinecap="round" opacity={waveOp} strokeDasharray={j > 1 ? "6 8" : "none"} />
                  );
                })}
                {[
                  { x: 250, y: 80, reached: false },
                  { x: 310, y: 140, reached: false },
                  { x: 280, y: 200, reached: false },
                  { x: 360, y: 100, reached: false },
                  { x: 380, y: 180, reached: false },
                  { x: 430, y: 130, reached: false },
                  { x: 440, y: 210, reached: false },
                  { x: 220, y: 140, reached: true },
                ].map((p, i) => {
                  const pSpring = spring({ frame: Math.max(0, frame - 185 - i * 3), fps, config: { damping: 12, stiffness: 100 } });
                  const color = p.reached ? "#EF4444" : "#4B5563";
                  const op = p.reached ? 0.8 : 0.35;
                  return (
                    <g key={i} opacity={pSpring * op} transform={`translate(${p.x}, ${p.y})`}>
                      <circle cx={0} cy={-12} r={8} fill={color} />
                      <path d="M 0 -4 L 0 12" stroke={color} strokeWidth={3} strokeLinecap="round" />
                      <path d="M -8 4 L 0 -1 L 8 4" fill="none" stroke={color} strokeWidth={2.5} strokeLinecap="round" strokeLinejoin="round" />
                      {!p.reached && (
                        <g opacity={0.5}>
                          <line x1={-5} y1={18} x2={5} y2={28} stroke="#6B7280" strokeWidth={2} strokeLinecap="round" />
                          <line x1={5} y1={18} x2={-5} y2={28} stroke="#6B7280" strokeWidth={2} strokeLinecap="round" />
                        </g>
                      )}
                    </g>
                  );
                })}
              </svg>
            </div>
          </div>
        </AbsoluteFill>
      )}
    </AbsoluteFill>
  );
};

登入後查看完整程式碼