分享图
动画工坊
引擎就绪
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>TRIZ 最终理想解:刚-液-柔多层缓冲复合接触</title>
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;500;700&family=Space+Grotesk:wght@400;600;700&display=swap" rel="stylesheet">
  <style>
    :root {
      /* Core Theme Colors */
      --bg-dark: #030712;
      --bg-panel: rgba(15, 23, 42, 0.65);
      --border-panel: rgba(56, 189, 248, 0.2);
      
      --metal-base: #94a3b8;
      --metal-highlight: #f8fafc;
      
      --liquid-cyan: #00f0ff;
      --soft-orange: #ff6a00;
      --soft-glow: #ffea00;
      
      /* Dynamic Variables controlled by JS */
      --oil-opacity: 0.85;
      --oil-thickness: 16px;
      --def-scale: 1.2;
      --pulse-speed: 2s;
    }

    * {
      box-sizing: border-box;
      margin: 0;
      padding: 0;
    }

    body {
      background-color: var(--bg-dark);
      background-image: 
        radial-gradient(circle at 50% 50%, #0f172a 0%, #030712 100%);
      color: #e2e8f0;
      font-family: 'Noto Sans SC', sans-serif;
      height: 100vh;
      overflow: hidden;
      display: flex;
      justify-content: center;
      align-items: center;
    }

    /* SVG Container */
    #animation-container {
      position: absolute;
      width: 100vw;
      height: 100vh;
      z-index: 1;
    }

    svg {
      width: 100%;
      height: 100%;
      display: block;
    }

    /* UI Overlays */
    .overlay-panel {
      position: absolute;
      z-index: 10;
      background: var(--bg-panel);
      backdrop-filter: blur(12px);
      -webkit-backdrop-filter: blur(12px);
      border: 1px solid var(--border-panel);
      border-radius: 12px;
      padding: 24px;
      box-shadow: 0 20px 40px rgba(0, 0, 0, 0.5), 
                  inset 0 1px 0 rgba(255, 255, 255, 0.1);
    }

    .top-left {
      top: 40px;
      left: 40px;
      width: 340px;
    }

    .bottom-right {
      bottom: 40px;
      right: 40px;
      width: 320px;
    }

    .bottom-left {
      bottom: 40px;
      left: 40px;
      display: flex;
      gap: 20px;
      background: transparent;
      border: none;
      box-shadow: none;
      backdrop-filter: none;
      padding: 0;
    }

    /* Typography inside Panels */
    .badge {
      display: inline-block;
      font-family: 'Space Grotesk', sans-serif;
      font-size: 11px;
      font-weight: 700;
      letter-spacing: 1.5px;
      text-transform: uppercase;
      background: rgba(0, 240, 255, 0.15);
      color: var(--liquid-cyan);
      padding: 4px 10px;
      border-radius: 4px;
      margin-bottom: 12px;
      border: 1px solid rgba(0, 240, 255, 0.3);
    }

    h1 {
      font-size: 20px;
      font-weight: 700;
      margin-bottom: 12px;
      line-height: 1.4;
      background: linear-gradient(to right, #fff, #94a3b8);
      -webkit-background-clip: text;
      -webkit-text-fill-color: transparent;
    }

    p {
      font-size: 13px;
      line-height: 1.6;
      color: #94a3b8;
      margin-bottom: 16px;
    }

    p:last-child {
      margin-bottom: 0;
    }

    /* Interactive Controls */
    .control-group {
      margin-bottom: 20px;
    }
    .control-group:last-child { margin-bottom: 0; }

    .control-header {
      display: flex;
      justify-content: space-between;
      margin-bottom: 8px;
      font-size: 12px;
      font-weight: 500;
      color: #cbd5e1;
    }

    .val-display {
      font-family: 'Space Grotesk', sans-serif;
      color: var(--liquid-cyan);
    }

    input[type=range] {
      -webkit-appearance: none;
      width: 100%;
      background: transparent;
    }

    input[type=range]::-webkit-slider-thumb {
      -webkit-appearance: none;
      height: 14px;
      width: 14px;
      border-radius: 50%;
      background: var(--liquid-cyan);
      cursor: pointer;
      margin-top: -5px;
      box-shadow: 0 0 10px var(--liquid-cyan);
    }

    input[type=range]::-webkit-slider-runnable-track {
      width: 100%;
      height: 4px;
      cursor: pointer;
      background: #334155;
      border-radius: 2px;
    }

    /* Legend Items */
    .legend-item {
      display: flex;
      align-items: center;
      gap: 10px;
      background: rgba(15, 23, 42, 0.8);
      padding: 10px 16px;
      border-radius: 8px;
      border: 1px solid rgba(255,255,255,0.05);
      font-size: 12px;
      color: #cbd5e1;
      backdrop-filter: blur(8px);
    }

    .color-box {
      width: 12px;
      height: 12px;
      border-radius: 3px;
    }

    .color-rigid { background: #94a3b8; }
    .color-liquid { background: var(--liquid-cyan); box-shadow: 0 0 8px var(--liquid-cyan); }
    .color-soft { background: var(--soft-orange); }

    /* SVG Animations */
    .wire-flow {
      stroke-dasharray: 20 15;
      animation: flow 1.5s linear infinite;
    }

    @keyframes flow {
      to { stroke-dashoffset: -35; }
    }

    .spin-cw {
      transform-origin: center;
      animation: spin 6s linear infinite;
    }

    .spin-ccw {
      transform-origin: center;
      animation: spinReverse 6s linear infinite;
    }

    @keyframes spin {
      100% { transform: rotate(360deg); }
    }

    @keyframes spinReverse {
      100% { transform: rotate(-360deg); }
    }

    .pulse-glow {
      transform-origin: center;
      animation: pulse var(--pulse-speed) ease-in-out infinite alternate;
    }

    @keyframes pulse {
      0% { opacity: 0.6; transform: scale(1); }
      100% { opacity: 1; transform: scale(var(--def-scale)); }
    }

    /* Droplet Animations */
    .droplet { opacity: 0; }
    .d-top { animation: dropDown 0.8s ease-in infinite; }
    .d-bot { animation: dropUp 0.8s ease-in infinite; }
    
    .del-1 { animation-delay: 0.1s; }
    .del-2 { animation-delay: 0.3s; }
    .del-3 { animation-delay: 0.5s; }
    .del-4 { animation-delay: 0.7s; }

    @keyframes dropDown {
      0% { transform: translate(0, 0) scale(1); opacity: 0.8; }
      80% { opacity: 1; }
      100% { transform: translate(15px, 60px) scale(0); opacity: 0; }
    }
    
    @keyframes dropUp {
      0% { transform: translate(0, 0) scale(1); opacity: 0.8; }
      80% { opacity: 1; }
      100% { transform: translate(15px, -60px) scale(0); opacity: 0; }
    }

    /* Dynamic CSS bindings applied via inline styles in JS */
    .dynamic-film {
      opacity: var(--oil-opacity);
      stroke-width: var(--oil-thickness);
      transition: all 0.3s ease;
    }
    
    .dynamic-contact {
      transform: scale(var(--def-scale));
      transition: transform 0.3s ease;
    }
  </style>
</head>
<body>

  <!-- Abstract Background Animation / SVG Data -->
  <div id="animation-container">
    <svg viewBox="0 0 1600 900" preserveAspectRatio="xMidYMid slice">
      <defs>
        <!-- Gradients -->
        <linearGradient id="metal-grad" x1="0%" y1="0%" x2="100%" y2="100%">
          <stop offset="0%" stop-color="#f8fafc" />
          <stop offset="50%" stop-color="#94a3b8" />
          <stop offset="100%" stop-color="#475569" />
        </linearGradient>

        <linearGradient id="dark-metal" x1="0%" y1="100%" x2="100%" y2="0%">
          <stop offset="0%" stop-color="#1e293b" />
          <stop offset="100%" stop-color="#0f172a" />
        </linearGradient>

        <linearGradient id="pu-grad" x1="0%" y1="0%" x2="100%" y2="100%">
          <stop offset="0%" stop-color="#ff8c00" />
          <stop offset="100%" stop-color="#cc5500" />
        </linearGradient>

        <linearGradient id="fluid-grad" x1="0%" y1="0%" x2="100%" y2="0%">
          <stop offset="0%" stop-color="transparent" />
          <stop offset="20%" stop-color="transparent" />
          <stop offset="25%" stop-color="#00f0ff" />
          <stop offset="100%" stop-color="#00f0ff" />
        </linearGradient>

        <!-- Filters -->
        <filter id="neon-glow" x="-50%" y="-50%" width="200%" height="200%">
          <feGaussianBlur stdDeviation="8" result="blur1" />
          <feGaussianBlur stdDeviation="16" result="blur2" />
          <feMerge>
            <feMergeNode in="blur2" />
            <feMergeNode in="blur1" />
            <feMergeNode in="SourceGraphic" />
          </feMerge>
        </filter>

        <filter id="soft-glow" x="-50%" y="-50%" width="200%" height="200%">
          <feGaussianBlur stdDeviation="12" result="blur" />
          <feComposite in="SourceGraphic" in2="blur" operator="over" />
        </filter>

        <filter id="shadow" x="-10%" y="-10%" width="120%" height="120%">
          <feDropShadow dx="0" dy="15" stdDeviation="15" flood-color="#000" flood-opacity="0.8" />
        </filter>

        <!-- Grid Pattern -->
        <pattern id="grid" width="40" height="40" patternUnits="userSpaceOnUse">
          <path d="M 40 0 L 40 40 M 0 40 L 40 40" fill="none" stroke="rgba(255,255,255,0.03)" stroke-width="1"/>
        </pattern>

        <clipPath id="film-clip">
          <rect x="250" y="0" width="1400" height="900" />
        </clipPath>
      </defs>

      <!-- Background Grid -->
      <rect width="100%" height="100%" fill="url(#grid)" />

      <!-- Machine Housing Background Accents -->
      <path d="M 100 0 L 400 900 L 0 900 Z" fill="rgba(15,23,42,0.3)" />
      <path d="M 1500 0 L 1200 900 L 1600 900 Z" fill="rgba(15,23,42,0.3)" />
      
      <!-- Center Guiding Line for Reference -->
      <line x1="0" y1="450" x2="1600" y2="450" stroke="rgba(255,255,255,0.05)" stroke-width="1" stroke-dasharray="5 5" />

      <!-- WIRE SYSTEM -->
      <g id="wire-system" filter="url(#shadow)">
        <!-- 1. The Dynamic Liquid Film (Cyan Glow behind/around wire) -->
        <!-- Only starts after the oil chamber (X ~ 280) -->
        <path class="dynamic-film" 
              d="M 0 450 L 250 450 C 350 450, 450 465, 550 465 C 750 465, 800 435, 950 435 C 1100 435, 1150 450, 1250 450 L 1600 450" 
              fill="none" stroke="url(#fluid-grad)" stroke-linecap="round" filter="url(#neon-glow)" />

        <!-- 2. The Rigid Wire Core (Silver) -->
        <path id="main-wire"
              d="M -50 450 L 250 450 C 350 450, 450 465, 550 465 C 750 465, 800 435, 950 435 C 1100 435, 1150 450, 1250 450 L 1650 450" 
              fill="none" stroke="url(#metal-grad)" stroke-width="14" stroke-linecap="round" />
        
        <!-- 3. Wire Flow Indicator (Scrolling dashed line to show movement direction) -->
        <path d="M -50 450 L 250 450 C 350 450, 450 465, 550 465 C 750 465, 800 435, 950 435 C 1100 435, 1150 450, 1250 450 L 1650 450" 
              fill="none" stroke="#ffffff" stroke-width="4" stroke-linecap="round" opacity="0.6" class="wire-flow" />
      </g>

      <!-- OIL MIST SPRAY CHAMBER (The "Liquid" Phase) -->
      <g id="oil-chamber" transform="translate(180, 250)">
        <!-- Chamber Back -->
        <rect x="0" y="0" width="120" height="400" rx="8" fill="url(#dark-metal)" stroke="#1e293b" stroke-width="4" filter="url(#shadow)" />
        
        <!-- Glass Window -->
        <rect x="15" y="50" width="90" height="300" rx="4" fill="rgba(0, 240, 255, 0.05)" stroke="var(--liquid-cyan)" stroke-width="2" opacity="0.7"/>
        
        <!-- Top Nozzle -->
        <path d="M 40 50 L 80 50 L 70 80 L 50 80 Z" fill="#94a3b8" />
        <rect x="55" y="80" width="10" height="20" fill="#cbd5e1" />
        <!-- Bottom Nozzle -->
        <path d="M 40 350 L 80 350 L 70 320 L 50 320 Z" fill="#94a3b8" />
        <rect x="55" y="300" width="10" height="20" fill="#cbd5e1" />

        <!-- Animated Droplets (Top) -->
        <circle cx="50" cy="110" r="3" fill="var(--liquid-cyan)" class="droplet d-top del-1" filter="url(#neon-glow)" />
        <circle cx="70" cy="100" r="4" fill="var(--liquid-cyan)" class="droplet d-top del-2" filter="url(#neon-glow)" />
        <circle cx="60" cy="120" r="2.5" fill="var(--liquid-cyan)" class="droplet d-top del-3" filter="url(#neon-glow)" />
        
        <!-- Animated Droplets (Bottom) -->
        <circle cx="55" cy="290" r="3.5" fill="var(--liquid-cyan)" class="droplet d-bot del-4" filter="url(#neon-glow)" />
        <circle cx="65" cy="280" r="3" fill="var(--liquid-cyan)" class="droplet d-bot del-1" filter="url(#neon-glow)" />
        <circle cx="45" cy="270" r="2" fill="var(--liquid-cyan)" class="droplet d-bot del-2" filter="url(#neon-glow)" />

        <!-- Tech Details -->
        <text x="60" y="30" fill="var(--liquid-cyan)" font-family="Space Grotesk" font-size="10" text-anchor="middle" font-weight="600" letter-spacing="1">LUBRICANT</text>
        <line x1="-20" y1="200" x2="140" y2="200" stroke="rgba(0, 240, 255, 0.3)" stroke-width="1" stroke-dasharray="2 4"/>
      </g>

      <!-- ROTARY STRAIGHTENER ROLLERS (The "Soft" Phase) -->
      
      <!-- Roller 1 (Top Left) -->
      <!-- Center: cx=550, cy=285, R=180. Wire is at y=465, so perfectly tangent -->
      <g id="roller-1" transform="translate(550, 285)" filter="url(#shadow)">
        <!-- PU Composite Outer Layer (Soft Layer) -->
        <circle cx="0" cy="0" r="180" fill="url(#pu-grad)" stroke="#ffb700" stroke-width="4" />
        <circle cx="0" cy="0" r="160" fill="url(#dark-metal)" />
        
        <!-- Rotating Inner Metallic Core -->
        <g class="spin-cw">
          <circle cx="0" cy="0" r="140" fill="none" stroke="url(#metal-grad)" stroke-width="20" stroke-dasharray="40 20" />
          <circle cx="0" cy="0" r="60" fill="url(#metal-grad)" />
          <!-- Spokes -->
          <line x1="0" y1="-60" x2="0" y2="-130" stroke="url(#metal-grad)" stroke-width="16" />
          <line x1="0" y1="60" x2="0" y2="130" stroke="url(#metal-grad)" stroke-width="16" />
          <line x1="-60" y1="0" x2="-130" y2="0" stroke="url(#metal-grad)" stroke-width="16" />
          <line x1="60" y1="0" x2="130" y2="0" stroke="url(#metal-grad)" stroke-width="16" />
          <circle cx="0" cy="0" r="20" fill="#1e293b" />
        </g>
      </g>

      <!-- Roller 2 (Bottom Middle) -->
      <!-- Center: cx=950, cy=615, R=180. Wire is at y=435 -->
      <g id="roller-2" transform="translate(950, 615)" filter="url(#shadow)">
        <!-- PU Composite Outer Layer -->
        <circle cx="0" cy="0" r="180" fill="url(#pu-grad)" stroke="#ffb700" stroke-width="4" />
        <circle cx="0" cy="0" r="160" fill="url(#dark-metal)" />
        
        <!-- Rotating Inner Metallic Core -->
        <g class="spin-ccw">
          <circle cx="0" cy="0" r="140" fill="none" stroke="url(#metal-grad)" stroke-width="20" stroke-dasharray="40 20" />
          <circle cx="0" cy="0" r="60" fill="url(#metal-grad)" />
          <!-- Spokes -->
          <line x1="0" y1="-60" x2="0" y2="-130" stroke="url(#metal-grad)" stroke-width="16" />
          <line x1="0" y1="60" x2="0" y2="130" stroke="url(#metal-grad)" stroke-width="16" />
          <line x1="-60" y1="0" x2="-130" y2="0" stroke="url(#metal-grad)" stroke-width="16" />
          <line x1="60" y1="0" x2="130" y2="0" stroke="url(#metal-grad)" stroke-width="16" />
          <circle cx="0" cy="0" r="20" fill="#1e293b" />
        </g>
      </g>

      <!-- Roller 3 (Top Right) -->
      <!-- Center: cx=1250, cy=270, R=180. Wire is at y=450 -->
      <g id="roller-3" transform="translate(1250, 270)" filter="url(#shadow)">
        <!-- PU Composite Outer Layer -->
        <circle cx="0" cy="0" r="180" fill="url(#pu-grad)" stroke="#ffb700" stroke-width="4" />
        <circle cx="0" cy="0" r="160" fill="url(#dark-metal)" />
        
        <!-- Rotating Inner Metallic Core -->
        <g class="spin-cw">
          <circle cx="0" cy="0" r="140" fill="none" stroke="url(#metal-grad)" stroke-width="20" stroke-dasharray="40 20" />
          <circle cx="0" cy="0" r="60" fill="url(#metal-grad)" />
          <!-- Spokes -->
          <line x1="0" y1="-60" x2="0" y2="-130" stroke="url(#metal-grad)" stroke-width="16" />
          <line x1="0" y1="60" x2="0" y2="130" stroke="url(#metal-grad)" stroke-width="16" />
          <line x1="-60" y1="0" x2="-130" y2="0" stroke="url(#metal-grad)" stroke-width="16" />
          <line x1="60" y1="0" x2="130" y2="0" stroke="url(#metal-grad)" stroke-width="16" />
          <circle cx="0" cy="0" r="20" fill="#1e293b" />
        </g>
      </g>

      <!-- IFR CORE HIGHLIGHTS: Dynamic Micro-deformation Contact Zones -->
      <!-- These glowing ellipses visually represent the PU layer yielding and absorbing the stress, 
           preventing metal-on-metal scratch. Modulated by the slider. -->
      <g id="contact-glows" filter="url(#soft-glow)">
        <!-- Contact 1 -->
        <ellipse cx="550" cy="465" rx="35" ry="12" fill="var(--soft-glow)" class="pulse-glow dynamic-contact" />
        <!-- Contact 2 -->
        <ellipse cx="950" cy="435" rx="35" ry="12" fill="var(--soft-glow)" class="pulse-glow dynamic-contact" />
        <!-- Contact 3 -->
        <ellipse cx="1250" cy="450" rx="35" ry="12" fill="var(--soft-glow)" class="pulse-glow dynamic-contact" />
      </g>

      <!-- SVG Annotation Lines mapping concepts -->
      <g stroke="rgba(255,255,255,0.3)" stroke-width="1" fill="none" stroke-dasharray="2 4">
        <!-- Pointer to Oil Film -->
        <path d="M 430 450 L 400 350 L 320 350" />
        <circle cx="430" cy="450" r="3" fill="var(--liquid-cyan)" />
        
        <!-- Pointer to PU Deformation -->
        <path d="M 550 465 L 550 560 L 600 560" />
        <circle cx="550" cy="465" r="3" fill="var(--soft-glow)" />
      </g>

      <!-- Minimal Inline SVG Labels -->
      <text x="310" y="345" fill="var(--liquid-cyan)" font-size="12" font-family="Noto Sans SC">动态润滑油膜 (0.2MPa)</text>
      <text x="610" y="565" fill="var(--soft-orange)" font-size="12" font-family="Noto Sans SC">聚氨酯微观弹性形变 (Shore 90A)</text>

    </svg>
  </div>

  <!-- Foreground UI: Top Left Conceptual Description -->
  <div class="overlay-panel top-left">
    <div class="badge">TRIZ 最终理想解 (IFR)</div>
    <h1>刚-液-柔<br>多层缓冲复合接触</h1>
    <p>直接阻断金属间的直接摩擦以防止划伤。在保留低成本旋转矫直机构的前提下,巧妙引入流体动力润滑层与非金属软接触面。</p>
    <p>通过聚氨酯(PU)复合轮的微观让位弹性,搭配 0.2MPa 极压抗磨油膜,将尖锐的接触应力完美吸收,实现无损高精矫直。</p>
  </div>

  <!-- Foreground UI: Bottom Right Interactive Controls -->
  <div class="overlay-panel bottom-right">
    <div class="control-group">
      <div class="control-header">
        <span>润滑油膜供给压力 (液)</span>
        <span class="val-display" id="val-oil">0.20 MPa</span>
      </div>
      <input type="range" id="slider-oil" min="0.05" max="0.5" step="0.01" value="0.2">
      <p style="font-size: 11px; margin-top: 6px; opacity: 0.7;">动态液膜承受剪切力,阻断直接摩擦</p>
    </div>
    
    <div class="control-group" style="margin-top: 24px;">
      <div class="control-header">
        <span style="color: var(--soft-orange)">聚氨酯包覆层硬度 (柔)</span>
        <span class="val-display" style="color: var(--soft-orange)" id="val-pu">Shore 90A</span>
      </div>
      <input type="range" id="slider-pu" min="80" max="100" step="1" value="90">
      <p style="font-size: 11px; margin-top: 6px; opacity: 0.7;">硬度越低,微观让位弹性形变越显著</p>
    </div>
  </div>

  <!-- Foreground UI: Bottom Left Visual Legend -->
  <div class="bottom-left">
    <div class="legend-item">
      <div class="color-box color-rigid"></div>
      <span>金属刚性体 (原系统)</span>
    </div>
    <div class="legend-item">
      <div class="color-box color-liquid"></div>
      <span>流体隔离层 (新引入)</span>
    </div>
    <div class="legend-item">
      <div class="color-box color-soft"></div>
      <span>柔性吸收层 (改造资源)</span>
    </div>
  </div>

  <script>
    // Interactive functionality to demonstrate the dynamic relationship
    // without stopping the continuous auto-play animation.
    
    const sliderOil = document.getElementById('slider-oil');
    const valOil = document.getElementById('val-oil');
    const sliderPu = document.getElementById('slider-pu');
    const valPu = document.getElementById('val-pu');
    const root = document.documentElement;

    // Oil Pressure Controls (Adjusts Cyan Glow Opacity & Thickness)
    sliderOil.addEventListener('input', (e) => {
      const val = parseFloat(e.target.value);
      valOil.textContent = val.toFixed(2) + ' MPa';
      
      // Map 0.05 - 0.5 to opacity 0.3 - 1.0
      const opacity = 0.3 + ((val - 0.05) / 0.45) * 0.7;
      // Map 0.05 - 0.5 to thickness 8px - 24px
      const thickness = 8 + ((val - 0.05) / 0.45) * 16;
      
      root.style.setProperty('--oil-opacity', opacity);
      root.style.setProperty('--oil-thickness', thickness + 'px');
    });

    // PU Hardness Controls (Adjusts Deformation Scale / Soft Glow Size)
    sliderPu.addEventListener('input', (e) => {
      const val = parseInt(e.target.value);
      valPu.textContent = 'Shore ' + val + 'A';
      
      // Inverse mapping: lower hardness (80) = more deformation (scale 1.8)
      // higher hardness (100) = less deformation (scale 0.8)
      const scale = 1.8 - ((val - 80) / 20) * 1.0;
      // Faster pulse on softer material
      const speed = 1.0 + ((val - 80) / 20) * 2.0; 
      
      root.style.setProperty('--def-scale', scale);
      root.style.setProperty('--pulse-speed', speed + 's');
    });

    // Ensure animations reset and play flawlessly if container reloads
    document.addEventListener("DOMContentLoaded", () => {
      // Trigger initial CSS variable computation
      sliderOil.dispatchEvent(new Event('input'));
      sliderPu.dispatchEvent(new Event('input'));
    });
  </script>
</body>
</html>
积分规则:第一轮对话扣减8分,后续每轮扣6分