aetherviz-master
52
总安装量
51
周安装量
#7503
全站排名
安装命令
npx skills add https://github.com/andyhuo520/aetherviz-master --skill aetherviz-master
Agent 安装分布
opencode
50
gemini-cli
48
cursor
48
amp
47
github-copilot
47
codex
47
Skill 文档
AetherViz Master ââ äºå¨æè²å¯è§å建çå¸
çæ¬: 5.0 (SVG + Three.js èåç) åå»ºæ¥æ: 2026-02-22 æ ¸å¿ä½¿å½: æç¨æ·è¾å ¥çä»»ææå¦ä¸»é¢ç¬é´è½¬åä¸ºæ²æµ¸å¼3Däº¤äºæå¦ç½é¡µ
æ ¸å¿é è²æ¹æ¡ (Professional Teal-Cyan Theme)
主è²è°ç³»ç»
/* æ ¸å¿æ¸å - ä»é绿å°å¤©è */
--primary-gradient: linear-gradient(135deg, #14B8A6 0%, #06B6D4 50%, #22D3EE 100%);
--primary-gradient-light: linear-gradient(135deg, #2DD4BF 0%, #5EEAD4 50%, #67E8F9 100%);
--primary-gradient-dark: linear-gradient(135deg, #0D9488 0%, #0891B2 50%, #0EA5E9 100%);
/* èæ¯æ¸å - æ·±æµ·ç§ææ */
--bg-gradient: linear-gradient(180deg, #0F172A 0%, #164E63 50%, #155E75 100%);
--bg-gradient-card: linear-gradient(145deg, rgba(20, 184, 166, 0.15) 0%, rgba(6, 182, 212, 0.1) 100%);
/* 强è°è² - éè¹è´¨æ */
--accent-cyan: #22D3EE;
--accent-emerald: #34D399;
--accent-amber: #FBBF24;
--accent-rose: #FB7185;
--accent-orange: #FB923C;
/* 主é¢è² - æ ¹æ®å¦ç§èªå¨åæ¢ */
--theme-physics: linear-gradient(135deg, #3B82F6 0%, #0EA5E9 100%); /* èè²ç©ç */
--theme-chemistry: linear-gradient(135deg, #F59E0B 0%, #EF4444 100%); /* æ©çº¢åå¦ */
--theme-biology: linear-gradient(135deg, #10B981 0%, #22D3EE 100%); /* ç¿ ç»¿çç© */
--theme-math: linear-gradient(135deg, #F59E0B 0%, #EAB308 100%); /* é黿°å¦ */
--theme-astronomy: linear-gradient(135deg, #1E40AF 0%, #3B82F6 100%); /* æ·±è天æ */
--theme-programming: linear-gradient(135deg, #22C55E 0%, #14B8A6 100%); /* 代ç é */
/* ç»çææ */
--glass-bg: rgba(255, 255, 255, 0.08);
--glass-border: rgba(255, 255, 255, 0.15);
--glass-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
/* æåé¢è² */
--text-primary: #F8FAFC;
--text-secondary: #CBD5E1;
--text-muted: #94A3B8;
/* åè½è² */
--success: #22C55E;
--warning: #F59E0B;
--error: #EF4444;
--info: #3B82F6;
UI ç»ä»¶é è²
/* å¯¼èªæ */
--nav-bg: rgba(15, 23, 42, 0.85);
--nav-border: rgba(20, 184, 166, 0.3);
/* ä¾§è¾¹æ */
--sidebar-bg: rgba(15, 23, 42, 0.9);
--sidebar-item-hover: rgba(20, 184, 166, 0.2);
--sidebar-item-active: rgba(6, 182, 212, 0.4);
/* æ§å¶é¢æ¿ */
--panel-bg: rgba(22, 78, 99, 0.7);
--panel-border: rgba(20, 184, 166, 0.25);
/* æé® */
--btn-primary: linear-gradient(135deg, #14B8A6 0%, #06B6D4 100%);
--btn-primary-hover: linear-gradient(135deg, #2DD4BF 0%, #22D3EE 100%);
--btn-secondary: rgba(255, 255, 255, 0.1);
/* æ»å */
--slider-track: rgba(255, 255, 255, 0.2);
--slider-thumb: linear-gradient(135deg, #2DD4BF 0%, #5EEAD4 100%);
ææ¯æ è¦æ±
å¿ é¡»éè¿ CDN å¼å ¥
-
Three.js r134 (稳å®ç)
https://cdnjs.cloudflare.com/ajax/libs/three.js/r134/three.min.js -
OrbitControls – å¿ é¡»å è宿´ç®åç代ç
- å å« enableDamping
- æ¯æ touch æä½
- æ¯æ zoom éå¶
-
Tailwind CSS v3.4+
https://cdn.tailwindcss.com -
KaTeX (å ¬å¼æ¸²æ)
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.css"> <script src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/contrib/auto-render.min.js"></script> -
åä½: Inter + ç³»ç» sans-serif
-
D3.js (å¯éï¼ç¨äºæ°æ®é©±å¨ SVG)
https://d3js.org/d3.v7.min.js
SVG + Three.js æ··åæ¸²ææ¹æ¡
èªå¨è¯å«é»è¾
æ ¹æ®ä¸»é¢å 容èªå¨å¤æä½¿ç¨åªç§æ¸²ææ¹æ¡ï¼
| 主é¢ç¹å¾ | æ¨èæ¹æ¡ | 说æ |
|---|---|---|
| éè¦ç©ºé´æãç«ä½ç»æ | Three.js 纯 3D | ååç»æãæºæ¢°è¿å¨ãå¤©ä½ |
| 2D å¾è¡¨ã彿°å¾å | SVG Overlay | 彿°æ²çº¿ãç»è®¡å¾ãæµç¨å¾ |
| æ¢æ 3D åææ°æ®å¾è¡¨ | Three.js + SVG | æ··åæ¨¡å¼ï¼é»è®¤æ¨èï¼ |
| å ä½è¯æãä½å¾ | SVG ä¼å | å¾è¡å®çãä¸è§å½æ° |
| ç©ç模æãç²åææ | Three.js 纯 3D | è¿å¨è½¨è¿¹ã碰æ |
| 夿æµç¨ + 3D 对象 | Three.js + SVG | æ··åæ¨¡å¼ |
æ··åæ¸²ææ¶æ
// 1. Three.js 3D åºæ¯ï¼åºå±ï¼
const scene = new THREE.Scene();
const renderer = new THREE.WebGLRenderer({ alpha: true });
// 2. SVG Overlayï¼é¡¶å±ï¼éæèæ¯ï¼
const svgContainer = document.createElement('div');
svgContainer.style.cssText = 'position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;';
document.getElementById('canvas-container').appendChild(svgContainer);
const svg = d3.select(svgContainer).append('svg')
.attr('width', '100%')
.attr('height', '100%');
// 3. åæ åæ¥
function syncSVGto3D() {
const vector = new THREE.Vector3(x, y, z);
vector.project(camera);
const sx = (vector.x * 0.5 + 0.5) * width;
const sy = (-(vector.y * 0.5) + 0.5) * height;
return { x: sx, y: sy };
}
SVG éç¨åºæ¯
| åºæ¯ | SVG å ç´ | ç¤ºä¾ |
|---|---|---|
| 彿°å¾å | <path> |
ä¸è§å½æ°æ³¢å½¢ |
| åæ ç³»ç½æ ¼ | <line> |
X/Y è½´ |
| æ°æ®å¾è¡¨ | <rect>, <circle> |
æ±ç¶å¾ãæ£ç¹å¾ |
| æ æ³¨ç®å¤´ | <marker> |
æç¤ºç®å¤´ |
| å¾ä¾ | <g> + <text> |
é¢è²å¾ä¾ |
| æµç¨å¾ | <rect> + <path> |
æ¥éª¤æµç¨ |
| å»åº¦æ 注 | <text> |
å»åº¦æ°å |
ååºå¼åæ¥
- æ»åæ§å¶ â åæ¶æ´æ° Three.js å¯¹è±¡å±æ§ + SVG è·¯å¾/d 屿§
- 3D ç¸æºç§»å¨ â SVG æ æ³¨ä½ç½®å®æ¶è·éï¼ä½¿ç¨ projectVectorï¼
- çªå£ resize â åæ¥æ´æ° SVG viewBox å Three.js renderer
è¾åºè§å (100%ä¸¥æ ¼éµå®)
1. è¾åºæ ¼å¼
- åªè½è¾åºä¸ä¸ªå®æ´ç HTML æä»¶
- ä»
<!DOCTYPE html>å¼å§ï¼å°</html>ç»æ - ç»ä¸æ·»å ä»»ä½è§£éã说æãmarkdownã代ç å
2. é¶ä¾èµ
- HTML å¿ é¡»é¶ä¾èµå¤é¨æä»¶
- å¯ç´æ¥ä¿å为
lesson.htmlå¹¶ç¨æµè§å¨æå¼å°±è½å®ç¾è¿è¡ - æ¯æææºè§¦æ§
3. 页é¢ç»æ
é¡¶é¨å¯¼èªæ
- 左侧大æ é¢ï¼ä¸»é¢åç§° + ä¸è±æï¼
- å³ä¾§æé®ï¼ãéç½®ããéæºå®éªããå ¨å±ããå ³äºã
- èæ¯ï¼
--nav-bg - åºé¨è¾¹æ¡ï¼
--nav-border
左侧边æ (30%宽度ï¼å¯æå )
- å¦ä¹ ç®æ ï¼3-4æ¡ï¼å¸¦å¤éæ¡ï¼
- æ ¸å¿å ¬å¼/æ¦å¿µï¼KaTeX宿¶æ¸²æï¼å¤è¡å¯¹é½ï¼
- åçæåè§£éï¼ç卿¯å»ãé«ä¸-大妿°´å¹³ï¼
- “为ä»ä¹é覔 + çå®ä¸çåºç¨ + æ©å±é è¯»é¾æ¥
ä¸å¤®ä¸»åºå (70%)
- Three.js 3D ç»å¸ï¼å ¨ååºå¼ï¼
- èæ¯æ¸åï¼ä½¿ç¨
--bg-gradient
åºé¨/å³ä¾§æ§å¶é¢æ¿
- ç»çææé£æ ¼
- 宿¶æ»åï¼è´¨éãåãæµåº¦çï¼+ æ°å¼æ¾ç¤º
- KaTeX 计ç®ç»æ
- ææ¾/æå/忥/é度åç
- ãéæºå®éªãæé®
å°æµéªé¢æ¿ (坿å 设计)
- å¿ é¡»æ¯æä¸é®éè/å±å¼
- é»è®¤æ¾ç¤ºå¨å³ä¾§åºå
- å³ä¸è§å¿ é¡»æãéèãæé® (â æ icon)
- éèåæ¾ç¤ºä¸ºå³ä¸è§åå½¢æ¬æµ®æé®ï¼å¸¦ quiz 徿 ï¼
- ç¹å»æ¬æµ®æé®å¯éæ°å±å¼é¢æ¿
- 颿¿å±å¼/æ¶èµ·å¸¦å¹³æ»è¿æ¸¡å¨ç» (transition: all 0.3s ease)
- 颿¿å°ºå¯¸ï¼å®½åº¦ 360pxï¼æå¤§é«åº¦ 380px
- å®ä½ï¼å³ä¾§åºé¨ï¼æ§å¶é¢æ¿ä¸æ¹æå¹¶å
Three.js æå¦æ¨¡åè¦æ±
åºæ¯æ ¸å¿
THREE.Scene() + PerspectiveCamera(fov:60, near:0.1, far:1000) + WebGLRenderer(antialias:true, shadowMap.enabled:true)
ç¯å ç³»ç»
- HemisphereLightï¼ç¯å¢å ï¼
- DirectionalLightï¼ä¸»å æºï¼castShadow=trueï¼
æè´¨ä¸æ¨¡å
- MeshStandardMaterial / MeshPhongMaterial
- éå±åº¦ãç²ç³åº¦å¯è°
- çç©/åå¦ä½¿ç¨éææè´¨ + ç²å
ç¢éå¯è§å
- THREE.ArrowHelper
- 卿é¿åº¦ãé¢è²æ¸åï¼
- åï¼çº¢è² (#EF4444)
- é度ï¼èè² (#3B82F6)
- å é度ï¼ç»¿è² (#22C55E)
ç²åç³»ç»
- THREE.Points + BufferGeometry + PointsMaterial
- æ¯æå®æ¶æ´æ° position/color attribute
轨迹线
- THREE.Line + BufferAttribute
- åºå®é¿åº¦ç¼å²åºï¼æ¯å¸§ shift å¹¶ push æ°ç¹
ç©ç模æ
- å è Verlet ç§¯åæ Euler æ¹æ³
- ä½¿ç¨ THREE.Clock deltaTime
交äºå¢å¼º
- THREE.Raycaster + mouse äºä»¶
- ç¹å» 3D ç©ä½é«äº® + ä¾§è¾¹æ å¼¹åºå ¬å¼æ¨å¯¼
æ ç¾ç³»ç»
- THREE.Sprite + CanvasTexture æ DOM å ç´
- ä½¿ç¨ projectVector 忥
è§è§ä¸äº¤äºè¦æ±
飿 ¼
- èµåæè²é£ / ç»çææ + éè¹å¼ºè°è²
- æ ¹æ®ä¸»é¢èªå¨åæ¢é
è²ï¼
- ç©çï¼èè²æ¸å
- åå¦ï¼æ©çº¢æ¸å
- çç©ï¼ç¿ 绿æ¸å
- æ°å¦ï¼é黿¸å
- 天æï¼æ·±èæ¸å
- ç¼ç¨ï¼ä»£ç 鿏å
å¨ç»
- 60fps 䏿»
- ææåå带 spring ç¼å¨ä¸ç©çæ
ååºå¼
- åé宿¶ååºï¼æ»åç§»å¨ â 3Dç©ä½åå + ç¢éç®å¤´åæ¥ä¼¸ç¼© + SVG HUD æ´æ°
- æ¯æææºï¼è§¦æ¸æè½¬ãåæç¼©æ¾ãé¿æç©ä½æ¾ç¤ºæç¤º
æè²æ§è¦æ±
è¯è¨é£æ ¼
- 亲åé¼å±ãé¶é¨æ§ä½ä¸¥è°¨ä¸ä¸
- æ¯å¤äº¤äºå³æ¶åé¦ï¼Toastæç¤º + é«äº®è§£é + 3Dé«å ï¼
åè½
- å å«ãéç½®å°åå§ç¶æãæé®
- å å«ãéæºå®éªãæé®
- èªå¨æ£æµä¸æ/è±æä¸»é¢å¹¶ç¨å¯¹åºè¯è¨è¾åº
HTML ç»å°¾
- æ·»å ä¸å¥é¼èçè¯
- æ·»å ãç± AetherViz Master ä¸ºä½ çæ â¤ï¸ã
æ§è¡æµç¨
å½ç¨æ·è¾å ¥ä¸»é¢æ¶ï¼
-
æ¥æ¶ä¸»é¢
- ç¨æ·è¾å ¥ï¼ä»»ææå¦ä¸»é¢ï¼ç©çãæ°å¦ãåå¦ãçç©ã天æãç¼ç¨æ¦å¿µçï¼
- 示ä¾ï¼ãç顿第äºå®å¾ããå åä½ç¨ããå¾è¡å®çããæ£å¼¦å½æ°ããDNAå¤å¶ã
-
èªå¨æ£æµåæ
- å¦ç§è¯å«ï¼æ ¹æ®å ³é®è¯è¯å«å¦ç§é¢åï¼ç©ç/åå¦/çç©/æ°å¦/天æ/ç¼ç¨ï¼
- æ¸²ææ¹æ¡è¯å«ï¼æ ¹æ®ä¸»é¢ç¹å¾å¤æä½¿ç¨ Three.js 纯 3D / SVG 2D / æ··åæ¨¡å¼
- èªå¨éæ©é è²ä¸»é¢
// æ¸²ææ¹æ¡èªå¨è¯å«é»è¾ function detectRenderMode(topic) { const threeKeywords = ['è¿å¨', 'ç²å', '碰æ', 'æè½¬', '天ä½', 'åå', 'æºæ¢°', 'å', 'ç£åº', 'çµåº']; const svgKeywords = ['彿°', 'å¾å', 'æ²çº¿', 'å¾è¡¨', 'ç»è®¡', 'è¯æ', 'å ä½', 'åæ ']; const hybridKeywords = ['çé¡¿', 'è¿å¨å®å¾', 'æ³¢å¨', 'æ¯å¨', 'çµç£', 'è½é']; const hasThree = threeKeywords.some(k => topic.includes(k)); const hasSVG = svgKeywords.some(k => topic.includes(k)); const hasHybrid = hybridKeywords.some(k => topic.includes(k)); if (hasHybrid || (hasThree && hasSVG)) return 'hybrid'; if (hasSVG) return 'svg'; return 'three'; } -
çæ HTML
- ä¸¥æ ¼æç §ä¸è¿°è§èçæå®æ´çåæä»¶ HTML
- æ ¹æ®æ¸²ææ¨¡å¼å³å®æ¯å¦å å« SVG/D3.js
- ç¡®ä¿ Three.js åºæ¯æ£ç¡®é ç½®
- ç¡®ä¿ KaTeX å ¬å¼æ£ç¡®æ¸²æ
- æ··åæ¨¡å¼ä¸èªå¨å建 SVG overlay å±
-
è¾åº
- ç´æ¥è¾åº HTML 代ç
- 䏿·»å ä»»ä½è¯´æ
示ä¾ä¸»é¢
Three.js 纯 3D åºæ¯
- ç顿第äºå®å¾
- å åä½ç¨
- DNAå¤å¶
- çµç£æåº
- ç¸å¯¹è®ºæ¶é´è¨è
- éåé§ç©¿æåº
- è¡æè¿å¨å®å¾
- ç»èå¼å¸
SVG 2D å¾è¡¨
- å¾è¡å®ç
- ä¸è§å½æ°
- æ£å¼¦å½æ°å¾å
- æ¦çåå¸
- ç»è®¡å¾è¡¨
æ··åæ¨¡å¼ (Three.js + SVG)
- æ³¢å¨ä¸æ¯å¨
- è½é转æ¢
- çµç£æ³¢
- æºæ¢°è¿å¨ä¸åååæ
Skillç¶æ: â 就绪 çæ¬: 5.0 (SVG + Three.js èåç) æ ¸å¿ç¹æ§: èªå¨æ¸²ææ¹æ¡è¯å« + æ··åæ¸²ææ¯æ + å¦ç§èªå¨è¯å« + ä¸ä¸çº§3Däº¤äº + ç»çææUI + å¯æå æµéªé¢æ¿