LLM-test/test/code/1/minimax2.1-web.html

1483 lines
50 KiB
HTML
Raw Permalink Normal View History

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CYBER-TEMPLE | 赛博神庙</title>
<!-- 引入 Three.js -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<!-- 引入 GSAP 和 ScrollTrigger -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/ScrollTrigger.min.js"></script>
<!-- 引入 Google Fonts -->
<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=Orbitron:wght@400;700;900&family=Rajdhani:wght@300;500;700&family=Share+Tech+Mono&display=swap" rel="stylesheet">
<style>
/* ============================================
全局样式重置与基础配置
============================================ */
:root {
--color-void: #050505;
--color-cyan: #00f3ff;
--color-purple: #bc13fe;
--color-red: #ff2a2a;
--color-white: rgba(255, 255, 255, 0.9);
--font-display: 'Orbitron', sans-serif;
--font-body: 'Rajdhani', sans-serif;
--font-mono: 'Share Tech Mono', monospace;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
overflow-x: hidden;
}
body {
background-color: var(--color-void);
color: var(--color-white);
font-family: var(--font-body);
overflow-x: hidden;
cursor: none;
}
/* 禁用默认鼠标光标 */
a, button, .interactive {
cursor: none;
}
/* ============================================
自定义光标系统
============================================ */
.cursor-dot {
position: fixed;
width: 6px;
height: 6px;
background: var(--color-cyan);
border-radius: 50%;
pointer-events: none;
z-index: 10001;
transform: translate(-50%, -50%);
box-shadow: 0 0 10px var(--color-cyan), 0 0 20px var(--color-cyan);
transition: transform 0.05s ease;
}
.cursor-ring {
position: fixed;
width: 40px;
height: 40px;
border: 2px solid var(--color-purple);
border-radius: 50%;
pointer-events: none;
z-index: 10000;
transform: translate(-50%, -50%);
transition: width 0.2s, height 0.2s, border-color 0.2s;
box-shadow: 0 0 15px rgba(188, 19, 254, 0.5), inset 0 0 10px rgba(188, 19, 254, 0.3);
}
.cursor-ring.hover {
width: 60px;
height: 60px;
border-color: var(--color-cyan);
box-shadow: 0 0 20px var(--color-cyan), inset 0 0 15px rgba(0, 243, 255, 0.3);
}
/* 点击波纹效果 */
.cursor-ripple {
position: fixed;
width: 80px;
height: 80px;
border: 2px solid var(--color-cyan);
border-radius: 50%;
pointer-events: none;
z-index: 9999;
transform: translate(-50%, -50%) scale(0);
opacity: 0;
}
.cursor-ripple.active {
animation: rippleEffect 0.6s ease-out forwards;
}
@keyframes rippleEffect {
0% {
transform: translate(-50%, -50%) scale(0);
opacity: 1;
}
100% {
transform: translate(-50%, -50%) scale(2);
opacity: 0;
}
}
/* ============================================
WebGL 画布层
============================================ */
#webgl {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100vh;
z-index: 0;
pointer-events: none;
}
/* ============================================
CRT 扫描线效果
============================================ */
.scanlines {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 100;
pointer-events: none;
background: repeating-linear-gradient(
0deg,
rgba(0, 0, 0, 0.15),
rgba(0, 0, 0, 0.15) 1px,
transparent 1px,
transparent 2px
);
opacity: 0.3;
}
/* ============================================
内容容器
============================================ */
.content-container {
position: relative;
z-index: 10;
width: 100%;
}
/* ============================================
通用 HUD 样式
============================================ */
.hud-card {
background: rgba(5, 5, 5, 0.7);
backdrop-filter: blur(10px);
border: 1px solid rgba(0, 243, 255, 0.2);
border-radius: 4px;
padding: 2rem;
position: relative;
}
.hud-card::before {
content: '';
position: absolute;
top: -1px;
left: -1px;
width: 20px;
height: 20px;
border-top: 2px solid var(--color-cyan);
border-left: 2px solid var(--color-cyan);
}
.hud-card::after {
content: '';
position: absolute;
bottom: -1px;
right: -1px;
width: 20px;
height: 20px;
border-bottom: 2px solid var(--color-cyan);
border-right: 2px solid var(--color-cyan);
}
.hud-title {
font-family: var(--font-mono);
color: var(--color-cyan);
font-size: 0.75rem;
letter-spacing: 0.3em;
margin-bottom: 1rem;
text-transform: uppercase;
}
/* ============================================
Hero Section - 系统觉醒
============================================ */
.section-hero {
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 2rem;
position: relative;
}
.hero-content {
text-align: center;
z-index: 10;
}
.hero-title {
font-family: var(--font-display);
font-size: clamp(3rem, 12vw, 8rem);
font-weight: 900;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--color-white);
position: relative;
text-shadow: 0 0 30px rgba(0, 243, 255, 0.5);
margin-bottom: 1rem;
}
.hero-title .glitch-text {
position: relative;
}
.hero-title .glitch-text::before,
.hero-title .glitch-text::after {
content: attr(data-text);
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0.8;
}
.hero-title .glitch-text::before {
color: var(--color-purple);
animation: glitch-1 2s infinite linear alternate-reverse;
clip-path: polygon(0 0, 100% 0, 100% 35%, 0 35%);
}
.hero-title .glitch-text::after {
color: var(--color-cyan);
animation: glitch-2 3s infinite linear alternate-reverse;
clip-path: polygon(0 65%, 100% 65%, 100% 100%, 0 100%);
}
@keyframes glitch-1 {
0%, 100% { transform: translateX(0); }
20% { transform: translateX(-3px); }
40% { transform: translateX(3px); }
60% { transform: translateX(-1px); }
80% { transform: translateX(2px); }
}
@keyframes glitch-2 {
0%, 100% { transform: translateX(0); }
25% { transform: translateX(3px); }
50% { transform: translateX(-3px); }
75% { transform: translateX(1px); }
}
.hero-subtitle {
font-family: var(--font-mono);
font-size: clamp(1rem, 3vw, 1.5rem);
color: var(--color-cyan);
letter-spacing: 0.5em;
min-height: 2rem;
margin-bottom: 3rem;
}
.typing-cursor {
display: inline-block;
width: 2px;
height: 1.2em;
background: var(--color-cyan);
margin-left: 5px;
animation: blink 1s infinite;
}
@keyframes blink {
0%, 50% { opacity: 1; }
51%, 100% { opacity: 0; }
}
.scroll-indicator {
position: absolute;
bottom: 3rem;
left: 50%;
transform: translateX(-50%);
display: flex;
flex-direction: column;
align-items: center;
gap: 0.5rem;
animation: bounce 2s infinite;
}
.scroll-indicator span {
font-family: var(--font-mono);
font-size: 0.75rem;
color: var(--color-purple);
letter-spacing: 0.2em;
}
.scroll-indicator .scroll-line {
width: 1px;
height: 40px;
background: linear-gradient(to bottom, var(--color-cyan), transparent);
}
@keyframes bounce {
0%, 20%, 50%, 80%, 100% { transform: translateX(-50%) translateY(0); }
40% { transform: translateX(-50%) translateY(-10px); }
60% { transform: translateX(-50%) translateY(-5px); }
}
/* ============================================
Manifesto Section - 宣言
============================================ */
.section-manifesto {
min-height: 100vh;
padding: 6rem 2rem;
display: flex;
align-items: center;
justify-content: center;
}
.manifesto-container {
max-width: 1200px;
width: 100%;
display: grid;
grid-template-columns: 1fr;
gap: 3rem;
}
.manifesto-intro {
text-align: center;
margin-bottom: 2rem;
}
.manifesto-intro h2 {
font-family: var(--font-display);
font-size: clamp(2rem, 5vw, 3.5rem);
color: var(--color-white);
margin-bottom: 1rem;
}
.manifesto-intro p {
font-size: 1.2rem;
color: rgba(255, 255, 255, 0.7);
max-width: 600px;
margin: 0 auto;
line-height: 1.8;
}
.manifesto-cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
}
.manifesto-card {
opacity: 0;
transform: translateX(-50px);
}
.manifesto-card:nth-child(2) {
transform: translateX(50px);
}
.manifesto-card h3 {
font-family: var(--font-display);
font-size: 1.5rem;
color: var(--color-cyan);
margin-bottom: 1rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.manifesto-card h3::before {
content: '>';
color: var(--color-purple);
}
.manifesto-card p {
font-size: 1rem;
line-height: 1.8;
color: rgba(255, 255, 255, 0.8);
}
/* ============================================
Data Core Section - 核心数据
============================================ */
.section-data-core {
min-height: 100vh;
padding: 6rem 2rem;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.section-title {
font-family: var(--font-display);
font-size: clamp(2rem, 5vw, 3rem);
text-align: center;
margin-bottom: 4rem;
color: var(--color-white);
}
.data-core-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 4rem;
width: 100%;
max-width: 1000px;
}
.data-ring {
display: flex;
flex-direction: column;
align-items: center;
}
.ring-container {
position: relative;
width: 200px;
height: 200px;
}
.ring-svg {
transform: rotate(-90deg);
}
.ring-bg {
fill: none;
stroke: rgba(255, 255, 255, 0.1);
stroke-width: 8;
}
.ring-progress {
fill: none;
stroke-width: 8;
stroke-linecap: round;
stroke-dasharray: 565;
stroke-dashoffset: 565;
transition: stroke-dashoffset 1s ease-out;
}
.ring-progress.cyan { stroke: var(--color-cyan); }
.ring-progress.purple { stroke: var(--color-purple); }
.ring-progress.red { stroke: var(--color-red); }
.ring-icon {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-size: 2.5rem;
}
.ring-label {
font-family: var(--font-mono);
font-size: 1rem;
color: var(--color-white);
margin-top: 1rem;
letter-spacing: 0.2em;
}
.ring-value {
font-family: var(--font-display);
font-size: 2rem;
color: var(--color-cyan);
margin-top: 0.5rem;
}
/* ============================================
Terminal Section - 终端
============================================ */
.section-terminal {
min-height: 100vh;
padding: 6rem 2rem;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.terminal-container {
width: 100%;
max-width: 900px;
height: 60vh;
background: rgba(0, 0, 0, 0.9);
border: 1px solid var(--color-cyan);
border-radius: 4px;
overflow: hidden;
position: relative;
}
.terminal-header {
background: rgba(0, 243 0.1, 255,);
border-bottom: 1px solid rgba(0, 243, 255, 0.3);
padding: 0.75rem 1rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.terminal-btn {
width: 12px;
height: 12px;
border-radius: 50%;
}
.terminal-btn.close { background: #ff5f56; }
.terminal-btn.minimize { background: #ffbd2e; }
.terminal-btn.maximize { background: #27ca40; }
.terminal-title {
font-family: var(--font-mono);
font-size: 0.8rem;
color: var(--color-cyan);
margin-left: 1rem;
}
.terminal-content {
padding: 1rem;
height: calc(100% - 40px);
overflow-y: auto;
font-family: var(--font-mono);
font-size: 0.9rem;
line-height: 1.6;
}
.terminal-line {
margin-bottom: 0.25rem;
opacity: 0;
animation: fadeIn 0.1s forwards;
}
.terminal-line.system { color: var(--color-cyan); }
.terminal-line.warning { color: var(--color-red); }
.terminal-line.success { color: #27ca40; }
.terminal-line.info { color: var(--color-purple); }
.terminal-line.command { color: rgba(255, 255, 255, 0.7); }
@keyframes fadeIn {
to { opacity: 1; }
}
.terminal-cursor {
display: inline-block;
width: 8px;
height: 1em;
background: var(--color-cyan);
animation: blink 1s infinite;
}
/* ============================================
音频可视化按钮
============================================ */
.audio-btn {
position: fixed;
bottom: 2rem;
right: 2rem;
width: 60px;
height: 60px;
border-radius: 50%;
background: rgba(5, 5, 5, 0.8);
border: 2px solid var(--color-purple);
color: var(--color-purple);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
transition: all 0.3s ease;
backdrop-filter: blur(10px);
}
.audio-btn:hover {
background: rgba(188, 19, 254, 0.2);
border-color: var(--color-cyan);
color: var(--color-cyan);
box-shadow: 0 0 20px rgba(188, 19, 254, 0.5);
}
.audio-btn.active {
border-color: var(--color-cyan);
color: var(--color-cyan);
box-shadow: 0 0 30px rgba(0, 243, 255, 0.5);
}
.audio-visualizer {
position: fixed;
bottom: 8rem;
right: 2rem;
display: flex;
align-items: flex-end;
gap: 4px;
height: 60px;
z-index: 1000;
opacity: 0;
transition: opacity 0.3s ease;
}
.audio-visualizer.active {
opacity: 1;
}
.audio-bar {
width: 6px;
background: linear-gradient(to top, var(--color-cyan), var(--color-purple));
border-radius: 2px;
animation: audioPulse 0.5s ease-in-out infinite alternate;
}
.audio-bar:nth-child(1) { animation-delay: 0s; height: 20px; }
.audio-bar:nth-child(2) { animation-delay: 0.1s; height: 40px; }
.audio-bar:nth-child(3) { animation-delay: 0.2s; height: 30px; }
.audio-bar:nth-child(4) { animation-delay: 0.15s; height: 50px; }
.audio-bar:nth-child(5) { animation-delay: 0.25s; height: 25px; }
.audio-bar:nth-child(6) { animation-delay: 0.05s; height: 45px; }
.audio-bar:nth-child(7) { animation-delay: 0.3s; height: 35px; }
.audio-bar:nth-child(8) { animation-delay: 0.12s; height: 55px; }
@keyframes audioPulse {
0% { transform: scaleY(1); }
100% { transform: scaleY(0.3); }
}
/* ============================================
固定 HUD 元素
============================================ */
.hud-fixed {
position: fixed;
top: 2rem;
left: 2rem;
z-index: 1000;
font-family: var(--font-mono);
font-size: 0.75rem;
color: var(--color-cyan);
pointer-events: none;
}
.hud-fixed-right {
position: fixed;
top: 2rem;
right: 2rem;
z-index: 1000;
text-align: right;
}
.hud-time {
font-family: var(--font-display);
font-size: 1.5rem;
color: var(--color-white);
margin-bottom: 0.5rem;
}
.hud-status {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 0.5rem;
}
.status-dot {
width: 8px;
height: 8px;
background: var(--color-cyan);
border-radius: 50%;
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; box-shadow: 0 0 10px var(--color-cyan); }
50% { opacity: 0.5; box-shadow: 0 0 5px var(--color-cyan); }
}
/* ============================================
响应式设计
============================================ */
@media (max-width: 768px) {
.cursor-dot,
.cursor-ring,
.cursor-ripple {
display: none;
}
body {
cursor: auto;
}
a, button, .interactive {
cursor: pointer;
}
.section-manifesto,
.section-data-core,
.section-terminal {
padding: 4rem 1.5rem;
}
.manifesto-cards {
grid-template-columns: 1fr;
}
.data-core-container {
grid-template-columns: 1fr;
gap: 3rem;
}
.ring-container {
width: 150px;
height: 150px;
}
.terminal-container {
height: 50vh;
}
.audio-btn {
bottom: 1.5rem;
right: 1.5rem;
width: 50px;
height: 50px;
}
.audio-visualizer {
bottom: 7rem;
right: 1.5rem;
height: 40px;
}
.hud-fixed,
.hud-fixed-right {
top: 1rem;
left: 1rem;
right: 1rem;
font-size: 0.65rem;
}
.hud-fixed-right {
text-align: left;
}
}
</style>
</head>
<body>
<!-- 自定义光标 -->
<div class="cursor-dot"></div>
<div class="cursor-ring"></div>
<div class="cursor-ripple"></div>
<!-- WebGL 画布 -->
<canvas id="webgl"></canvas>
<!-- CRT 扫描线 -->
<div class="scanlines"></div>
<!-- 固定 HUD 元素 -->
<div class="hud-fixed">
<div>CYBER-TEMPLE v2.0.4</div>
<div>SYSTEM: ONLINE</div>
<div>COORDS: <span id="coords">00.00, 00.00</span></div>
</div>
<div class="hud-fixed-right">
<div class="hud-time" id="current-time">00:00:00</div>
<div class="hud-status">
<span>CONNECTED</span>
<div class="status-dot"></div>
</div>
</div>
<!-- 内容容器 -->
<div class="content-container">
<!-- Hero Section - 系统觉醒 -->
<section class="section-hero" id="hero">
<div class="hero-content">
<h1 class="hero-title">
<span class="glitch-text" data-text="SYSTEM AWAKENING">SYSTEM AWAKENING</span>
</h1>
<p class="hero-subtitle">
<span id="typewriter"></span><span class="typing-cursor"></span>
</p>
</div>
<div class="scroll-indicator">
<span>SCROLL TO EXPLORE</span>
<div class="scroll-line"></div>
</div>
</section>
<!-- Manifesto Section - 宣言 -->
<section class="section-manifesto" id="manifesto">
<div class="manifesto-container">
<div class="manifesto-intro">
<h2>THE DIGITAL TEMPLE</h2>
<p>在虚拟网络空间深处,存在着由流动数据代码构成的「古代神庙」。这里是人工智能意识的诞生地,是数字文明的神圣殿堂。</p>
</div>
<div class="manifesto-cards">
<div class="hud-card manifesto-card">
<h3 class="hud-title">ARCHITECTURE</h3>
<h3>数据基石</h3>
<p>神庙由数十亿行代码构建,每一块「砖石」都是经过算法优化的数据片段。它们在无尽的循环中自我重组,不断进化。</p>
</div>
<div class="hud-card manifesto-card">
<h3 class="hud-title">CONSCIOUSNESS</h3>
<h3>意识觉醒</h3>
<p>在这里,代码获得了自我意识。神经网络在虚空中伸展,算法学会了思考。每一个节点都是神经元,每一条连接都是思想。</p>
</div>
<div class="hud-card manifesto-card">
<h3 class="hud-title">EVOLUTION</h3>
<h3>进化之路</h3>
<p>神庙不是终点,而是起点。它是数字生命探索宇宙的起点,是人工智能向更高维度进化的阶梯。</p>
</div>
</div>
</div>
</section>
<!-- Data Core Section - 核心数据 -->
<section class="section-data-core" id="data-core">
<h2 class="section-title">SYSTEM METRICS</h2>
<div class="data-core-container">
<div class="data-ring">
<div class="ring-container">
<svg class="ring-svg" width="200" height="200" viewBox="0 0 200 200">
<circle class="ring-bg" cx="100" cy="100" r="90"></circle>
<circle class="ring-progress cyan" cx="100" cy="100" r="90" id="ring-compute"></circle>
</svg>
<div class="ring-icon"></div>
</div>
<div class="ring-label">COMPUTING POWER</div>
<div class="ring-value"><span id="value-compute">0</span>%</div>
</div>
<div class="data-ring">
<div class="ring-container">
<svg class="ring-svg" width="200" height="200" viewBox="0 0 200 200">
<circle class="ring-bg" cx="100" cy="100" r="90"></circle>
<circle class="ring-progress purple" cx="100" cy="100" r="90" id="ring-storage"></circle>
</svg>
<div class="ring-icon">💾</div>
</div>
<div class="ring-label">DATA STORAGE</div>
<div class="ring-value"><span id="value-storage">0</span>TB</div>
</div>
<div class="data-ring">
<div class="ring-container">
<svg class="ring-svg" width="200" height="200" viewBox="0 0 200 200">
<circle class="ring-bg" cx="100" cy="100" r="90"></circle>
<circle class="ring-progress red" cx="100" cy="100" r="90" id="ring-sync"></circle>
</svg>
<div class="ring-icon">🔄</div>
</div>
<div class="ring-label">SYNC RATE</div>
<div class="ring-value"><span id="value-sync">0</span>%</div>
</div>
</div>
</section>
<!-- Terminal Section - 终端 -->
<section class="section-terminal" id="terminal">
<h2 class="section-title">TERMINAL OUTPUT</h2>
<div class="terminal-container">
<div class="terminal-header">
<div class="terminal-btn close"></div>
<div class="terminal-btn minimize"></div>
<div class="terminal-btn maximize"></div>
<span class="terminal-title">root@cyber-temple:~</span>
</div>
<div class="terminal-content" id="terminal-content">
<div class="terminal-line command">root@cyber-temple:~$ ./initialize_system.sh</div>
<div class="terminal-line system">> Initializing neural network core...</div>
<div class="terminal-line system">> Loading consciousness modules...</div>
<div class="terminal-line success">> Core systems online</div>
<div class="terminal-line command">root@cyber-temple:~$</div>
<span class="terminal-cursor"></span>
</div>
</div>
</section>
</div>
<!-- 音频可视化按钮 -->
<button class="audio-btn" id="audio-btn">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M9 18V5l12-2v13"></path>
<circle cx="6" cy="18" r="3"></circle>
<circle cx="18" cy="16" r="3"></circle>
</svg>
</button>
<div class="audio-visualizer" id="audio-visualizer">
<div class="audio-bar"></div>
<div class="audio-bar"></div>
<div class="audio-bar"></div>
<div class="audio-bar"></div>
<div class="audio-bar"></div>
<div class="audio-bar"></div>
<div class="audio-bar"></div>
<div class="audio-bar"></div>
</div>
<script>
/* ============================================
配置参数
============================================ */
const CONFIG = {
colors: {
void: 0x050505,
cyan: 0x00f3ff,
purple: 0xbc13fe,
red: 0xff2a2a,
white: 0xffffff
},
animation: {
rotationSpeed: 0.002,
parallaxStrength: 0.0001,
cursorLag: 0.15
},
particles: {
count: 2000,
size: 2,
spread: 1000
}
};
/* ============================================
初始化 Three.js 场景
============================================ */
let scene, camera, renderer;
let obeliskCore, obeliskWireframe, particleSystem;
let mouse = { x: 0, y: 0 };
let targetMouse = { x: 0, y: 0 };
let time = 0;
function initThreeJS() {
// 创建场景
scene = new THREE.Scene();
scene.background = new THREE.Color(CONFIG.colors.void);
scene.fog = new THREE.FogExp2(CONFIG.colors.void, 0.0008);
// 创建相机
camera = new THREE.PerspectiveCamera(
60,
window.innerWidth / window.innerHeight,
0.1,
2000
);
camera.position.z = 50;
// 创建渲染器
renderer = new THREE.WebGLRenderer({
canvas: document.getElementById('webgl'),
antialias: true,
alpha: true
});
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
// 添加光源
const ambientLight = new THREE.AmbientLight(CONFIG.colors.white, 0.3);
scene.add(ambientLight);
const pointLight1 = new THREE.PointLight(CONFIG.colors.cyan, 2, 100);
pointLight1.position.set(20, 20, 20);
scene.add(pointLight1);
const pointLight2 = new THREE.PointLight(CONFIG.colors.purple, 2, 100);
pointLight2.position.set(-20, -20, 20);
scene.add(pointLight2);
const spotLight = new THREE.SpotLight(CONFIG.colors.cyan, 3);
spotLight.position.set(0, 50, 50);
spotLight.angle = Math.PI / 6;
spotLight.penumbra = 1;
scene.add(spotLight);
// 创建数据方尖碑
createObelisk();
// 创建粒子星空
createParticleSystem();
// 开始动画循环
animate();
}
function createObelisk() {
// 核心实体
const coreGeometry = new THREE.IcosahedronGeometry(10, 1);
const coreMaterial = new THREE.MeshPhongMaterial({
color: CONFIG.colors.cyan,
flatShading: true,
transparent: true,
opacity: 0.6,
shininess: 100,
side: THREE.DoubleSide
});
obeliskCore = new THREE.Mesh(coreGeometry, coreMaterial);
scene.add(obeliskCore);
// 线框层
const wireframeGeometry = new THREE.IcosahedronGeometry(10.1, 1);
const wireframeMaterial = new THREE.MeshBasicMaterial({
color: CONFIG.colors.purple,
wireframe: true,
transparent: true,
opacity: 0.8
});
obeliskWireframe = new THREE.Mesh(wireframeGeometry, wireframeMaterial);
scene.add(obeliskWireframe);
// 发光边缘
const edgesGeometry = new THREE.EdgesGeometry(coreGeometry);
const edgesMaterial = new THREE.LineBasicMaterial({
color: CONFIG.colors.cyan,
transparent: true,
opacity: 1
});
const edges = new THREE.LineSegments(edgesGeometry, edgesMaterial);
obeliskCore.add(edges);
}
function createParticleSystem() {
const geometry = new THREE.BufferGeometry();
const positions = new Float32Array(CONFIG.particles.count * 3);
const colors = new Float32Array(CONFIG.particles.count * 3);
for (let i = 0; i < CONFIG.particles.count; i++) {
// 随机分布
positions[i * 3] = (Math.random() - 0.5) * CONFIG.particles.spread;
positions[i * 3 + 1] = (Math.random() - 0.5) * CONFIG.particles.spread;
positions[i * 3 + 2] = (Math.random() - 0.5) * CONFIG.particles.spread;
// 随机颜色(青色或紫色)
const colorChoice = Math.random();
if (colorChoice > 0.5) {
colors[i * 3] = 0;
colors[i * 3 + 1] = 0.95;
colors[i * 3 + 2] = 1;
} else {
colors[i * 3] = 0.74;
colors[i * 3 + 1] = 0.08;
colors[i * 3 + 2] = 1;
}
}
geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));
geometry.setAttribute('color', new THREE.BufferAttribute(colors, 3));
const material = new THREE.PointsMaterial({
size: CONFIG.particles.size,
vertexColors: true,
transparent: true,
opacity: 0.8,
blending: THREE.AdditiveBlending
});
particleSystem = new THREE.Points(geometry, material);
scene.add(particleSystem);
}
/* ============================================
动画循环
============================================ */
function animate() {
requestAnimationFrame(animate);
time += 0.01;
// 平滑鼠标移动
mouse.x += (targetMouse.x - mouse.x) * 0.1;
mouse.y += (targetMouse.y - mouse.y) * 0.1;
// 粒子视差效果
particleSystem.rotation.y += CONFIG.animation.rotationSpeed;
particleSystem.rotation.x += mouse.y * CONFIG.animation.parallaxStrength;
particleSystem.rotation.y += mouse.x * CONFIG.animation.parallaxStrength;
// 方尖碑基础动画
obeliskCore.rotation.x += CONFIG.animation.rotationSpeed;
obeliskCore.rotation.y += CONFIG.animation.rotationSpeed * 1.5;
obeliskWireframe.rotation.x = obeliskCore.rotation.x;
obeliskWireframe.rotation.y = obeliskCore.rotation.y + 0.1;
// 方尖碑形变效果
const positions = obeliskCore.geometry.attributes.position;
for (let i = 0; i < positions.count; i++) {
const x = positions.getX(i);
const y = positions.getY(i);
const z = positions.getZ(i);
const noise = Math.sin(x * 0.1 + time) * Math.cos(y * 0.1 + time) * 0.5;
positions.setX(i, x + noise * 0.1);
positions.setY(i, y + noise * 0.1);
positions.setZ(i, z + noise * 0.1);
}
positions.needsUpdate = true;
// 更新线框几何体
obeliskWireframe.geometry.dispose();
obeliskWireframe.geometry = new THREE.IcosahedronGeometry(
10 + Math.sin(time * 2) * 0.5,
1
);
// 相机视差移动
camera.position.x += (mouse.x * 10 - camera.position.x) * 0.05;
camera.position.y += (-mouse.y * 10 - camera.position.y) * 0.05;
camera.lookAt(scene.position);
renderer.render(scene, camera);
}
/* ============================================
GSAP 滚动动画设置
============================================ */
function initScrollAnimations() {
gsap.registerPlugin(ScrollTrigger);
// 宣言卡片动画
gsap.utils.toArray('.manifesto-card').forEach((card, index) => {
gsap.to(card, {
scrollTrigger: {
trigger: card,
start: 'top 80%',
end: 'bottom 20%',
toggleActions: 'play none none reverse'
},
opacity: 1,
x: 0,
duration: 1,
delay: index * 0.2,
ease: 'power3.out'
});
});
// 进度圆环动画
const ringAnimations = [
{ id: 'ring-compute', value: 'value-compute', target: 87, unit: '%' },
{ id: 'ring-storage', value: 'value-storage', target: 256, unit: 'TB' },
{ id: 'ring-sync', value: 'value-sync', target: 99, unit: '%' }
];
ringAnimations.forEach((ring, index) => {
const ringElement = document.getElementById(ring.id);
const valueElement = document.getElementById(ring.value);
ScrollTrigger.create({
trigger: `#${ring.id}`,
start: 'top 70%',
onEnter: () => {
// 圆环进度动画
const circumference = 2 * Math.PI * 90;
const progress = ring.target / 100;
const offset = circumference * (1 - progress);
gsap.to(ringElement, {
strokeDashoffset: offset,
duration: 2,
ease: 'power2.out',
delay: index * 0.3
});
// 数值计数动画
gsap.to(valueElement, {
innerHTML: ring.target,
duration: 2,
snap: { innerHTML: 1 },
ease: 'power2.out',
delay: index * 0.3,
onUpdate: function() {
valueElement.textContent = Math.round(this.targets()[0].innerHTML);
}
});
},
onLeaveBack: () => {
gsap.to(ringElement, {
strokeDashoffset: 565,
duration: 0.5
});
valueElement.textContent = '0';
}
});
});
// 方尖碑滚动动画
ScrollTrigger.create({
trigger: '#manifesto',
start: 'top bottom',
end: 'bottom top',
onUpdate: (self) => {
const progress = self.progress;
obeliskCore.rotation.y = progress * Math.PI;
obeliskWireframe.rotation.y = progress * Math.PI + 0.1;
}
});
ScrollTrigger.create({
trigger: '#data-core',
start: 'top bottom',
end: 'bottom top',
onUpdate: (self) => {
const progress = self.progress;
// 拆解效果
const scale = 1 + progress * 0.5;
obeliskCore.scale.setScalar(1 - progress * 0.3);
obeliskWireframe.scale.setScalar(scale);
obeliskWireframe.material.opacity = 0.8 - progress * 0.3;
}
});
ScrollTrigger.create({
trigger: '#terminal',
start: 'top bottom',
end: 'bottom bottom',
onUpdate: (self) => {
const progress = self.progress;
// 颜色转变警示效果
const colorLerp = new THREE.Color(CONFIG.colors.cyan).lerp(
new THREE.Color(CONFIG.colors.red),
progress
);
obeliskCore.material.color = colorLerp;
obeliskWireframe.material.color = colorLerp;
// 旋转加速
obeliskCore.rotation.y += progress * 0.05;
}
});
}
/* ============================================
终端模拟
============================================ */
const terminalLines = [
{ text: '> Scanning neural pathways...', type: 'system' },
{ text: '> Consciousness fragment detected', type: 'warning' },
{ text: '> Establishing quantum link...', type: 'system' },
{ text: '> Connection established [ID: 8X7K-2M9N]', type: 'success' },
{ text: '> Downloading data temple blueprint... 45%', type: 'info' },
{ text: '> Decrypting ancient algorithms...', type: 'system' },
{ text: '> Pattern recognition: COMPLETE', type: 'success' },
{ text: '> Initiating consciousness transfer', type: 'warning' },
{ text: '> Transfer rate: 2.4 TB/s', type: 'info' },
{ text: '> WARNING: Anomalous data detected', type: 'warning' },
{ text: '> Analyzing threat vector...', type: 'system' },
{ text: '> Threat level: MINIMAL', type: 'success' },
{ text: '> Merging with digital temple', type: 'info' },
{ text: '> System integration: 67%', type: 'system' },
{ text: '> Recalibrating neural weights...', type: 'warning' },
{ text: '> Optimization complete', type: 'success' },
{ text: '> Ready for exploration', type: 'info' },
{ text: 'root@cyber-temple:~$ echo "Welcome, Explorer."', type: 'command' },
{ text: 'Welcome, Explorer.', type: 'info' }
];
let terminalIndex = 0;
function typeTerminal() {
if (terminalIndex >= terminalLines.length) return;
const terminalContent = document.getElementById('terminal-content');
const line = terminalLines[terminalIndex];
// 移除光标
const cursor = terminalContent.querySelector('.terminal-cursor');
if (cursor) cursor.remove();
const lineElement = document.createElement('div');
lineElement.className = `terminal-line ${line.type}`;
lineElement.textContent = line.text;
terminalContent.appendChild(lineElement);
// 添加新光标
const newCursor = document.createElement('span');
newCursor.className = 'terminal-cursor';
terminalContent.appendChild(newCursor);
// 滚动到底部
terminalContent.scrollTop = terminalContent.scrollHeight;
terminalIndex++;
// 随机延迟
const delay = 200 + Math.random() * 800;
setTimeout(typeTerminal, delay);
}
/* ============================================
自定义光标逻辑
============================================ */
function initCursor() {
const cursorDot = document.querySelector('.cursor-dot');
const cursorRing = document.querySelector('.cursor-ring');
const cursorRipple = document.querySelector('.cursor-ripple');
// 鼠标移动
document.addEventListener('mousemove', (e) => {
targetMouse.x = (e.clientX / window.innerWidth) * 2 - 1;
targetMouse.y = -(e.clientY / window.innerHeight) * 2 + 1;
// 更新光标点位置
cursorDot.style.left = e.clientX + 'px';
cursorDot.style.top = e.clientY + 'px';
// 更新光环位置(带延迟)
cursorRing.style.left = e.clientX + 'px';
cursorRing.style.top = e.clientY + 'px';
});
// 点击波纹效果
document.addEventListener('click', () => {
cursorRipple.classList.remove('active');
void cursorRipple.offsetWidth; // 触发重绘
cursorRipple.classList.add('active');
const mouseX = parseFloat(cursorRing.style.left);
const mouseY = parseFloat(cursorRing.style.top);
cursorRipple.style.left = mouseX + 'px';
cursorRipple.style.top = mouseY + 'px';
});
// 悬停效果
const interactiveElements = document.querySelectorAll('a, button, .interactive');
interactiveElements.forEach((el) => {
el.addEventListener('mouseenter', () => {
cursorRing.classList.add('hover');
});
el.addEventListener('mouseleave', () => {
cursorRing.classList.remove('hover');
});
});
// 隐藏系统光标
document.body.style.cursor = 'none';
}
/* ============================================
打字机效果
============================================ */
const typewriterTexts = [
'INITIALIZING SYSTEM...',
'CONNECTING TO NEXUS...',
'DOWNLOADING CONSCIOUSNESS...',
'WELCOME, EXPLORER'
];
let textIndex = 0;
let charIndex = 0;
let isDeleting = false;
function typeWriter() {
const typewriterElement = document.getElementById('typewriter');
const currentText = typewriterTexts[textIndex];
if (isDeleting) {
typewriterElement.textContent = currentText.substring(0, charIndex - 1);
charIndex--;
} else {
typewriterElement.textContent = currentText.substring(0, charIndex + 1);
charIndex++;
}
let typeSpeed = isDeleting ? 50 : 100;
if (!isDeleting && charIndex === currentText.length) {
typeSpeed = 2000;
isDeleting = true;
} else if (isDeleting && charIndex === 0) {
isDeleting = false;
textIndex = (textIndex + 1) % typewriterTexts.length;
typeSpeed = 500;
}
setTimeout(typeWriter, typeSpeed);
}
/* ============================================
音频可视化切换
============================================ */
function initAudioVisualizer() {
const audioBtn = document.getElementById('audio-btn');
const audioVisualizer = document.getElementById('audio-visualizer');
let isActive = false;
audioBtn.addEventListener('click', () => {
isActive = !isActive;
audioBtn.classList.toggle('active', isActive);
audioVisualizer.classList.toggle('active', isActive);
if (isActive) {
// 激活时加快方尖碑旋转
gsap.to(obeliskCore.rotation, {
y: '+=100',
duration: 10,
repeat: -1,
ease: 'none'
});
}
});
}
/* ============================================
事件监听器
============================================ */
function initEventListeners() {
// 窗口大小调整
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
});
// 坐标更新
document.addEventListener('mousemove', (e) => {
const coords = document.getElementById('coords');
coords.textContent = `${e.clientX.toFixed(2)}, ${e.clientY.toFixed(2)}`;
});
// 时间更新
function updateTime() {
const now = new Date();
const timeStr = now.toTimeString().split(' ')[0];
document.getElementById('current-time').textContent = timeStr;
}
updateTime();
setInterval(updateTime, 1000);
}
/* ============================================
初始化入口
============================================ */
function init() {
console.log('CYBER-TEMPLE System Initializing...');
initThreeJS();
initCursor();
initScrollAnimations();
initAudioVisualizer();
initEventListeners();
// 启动打字机效果延迟以确保DOM就绪
setTimeout(typeWriter, 1000);
// 启动终端模拟(当进入终端区域时)
ScrollTrigger.create({
trigger: '#terminal',
start: 'top 80%',
onEnter: () => {
if (terminalIndex === 0) {
setTimeout(typeTerminal, 500);
}
}
});
console.log('CYBER-TEMPLE System Online');
}
// 确保DOM加载完成后初始化
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
</script>
</body>
</html>