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

1483 lines
50 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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>