|
<!DOCTYPE html> |
|
<html lang="en"> |
|
<head> |
|
<meta charset="UTF-8"> |
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
<title>AI Agentic Demo - Dynamic Fractals & 3D Control</title> |
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script> |
|
<style> |
|
body { |
|
margin: 0; |
|
padding: 0; |
|
background: linear-gradient(135deg, #0c0c0c 0%, #1a1a2e 50%, #16213e 100%); |
|
font-family: 'Courier New', monospace; |
|
color: #00ff88; |
|
overflow: hidden; |
|
} |
|
|
|
.dashboard { |
|
position: absolute; |
|
top: 0; |
|
left: 0; |
|
width: 100%; |
|
height: 100%; |
|
display: grid; |
|
grid-template-columns: 300px 1fr 300px; |
|
grid-template-rows: 60px 1fr 200px; |
|
gap: 10px; |
|
padding: 10px; |
|
box-sizing: border-box; |
|
} |
|
|
|
.header { |
|
grid-column: 1 / -1; |
|
background: rgba(0, 255, 136, 0.1); |
|
border: 1px solid #00ff88; |
|
border-radius: 8px; |
|
display: flex; |
|
align-items: center; |
|
justify-content: space-between; |
|
padding: 0 20px; |
|
backdrop-filter: blur(10px); |
|
} |
|
|
|
.ai-panel { |
|
background: rgba(0, 255, 136, 0.05); |
|
border: 1px solid #00ff88; |
|
border-radius: 8px; |
|
padding: 15px; |
|
backdrop-filter: blur(10px); |
|
overflow-y: auto; |
|
} |
|
|
|
.viz-container { |
|
position: relative; |
|
border: 1px solid #00ff88; |
|
border-radius: 8px; |
|
overflow: hidden; |
|
background: rgba(0, 0, 0, 0.3); |
|
} |
|
|
|
.control-panel { |
|
grid-column: 1 / -1; |
|
background: rgba(0, 255, 136, 0.05); |
|
border: 1px solid #00ff88; |
|
border-radius: 8px; |
|
padding: 15px; |
|
backdrop-filter: blur(10px); |
|
display: grid; |
|
grid-template-columns: repeat(4, 1fr); |
|
gap: 15px; |
|
} |
|
|
|
.agent-card { |
|
background: rgba(0, 255, 136, 0.1); |
|
border: 1px solid #00ff88; |
|
border-radius: 4px; |
|
padding: 10px; |
|
margin-bottom: 10px; |
|
transition: all 0.3s ease; |
|
} |
|
|
|
.agent-card:hover { |
|
background: rgba(0, 255, 136, 0.2); |
|
transform: translateX(5px); |
|
} |
|
|
|
.agent-status { |
|
display: inline-block; |
|
width: 8px; |
|
height: 8px; |
|
border-radius: 50%; |
|
margin-right: 8px; |
|
} |
|
|
|
.active { background: #00ff88; } |
|
.idle { background: #ffaa00; } |
|
.error { background: #ff4444; } |
|
|
|
button { |
|
background: linear-gradient(45deg, #00ff88, #00cc66); |
|
border: none; |
|
border-radius: 4px; |
|
color: #000; |
|
padding: 8px 16px; |
|
font-weight: bold; |
|
cursor: pointer; |
|
transition: all 0.3s ease; |
|
font-family: inherit; |
|
} |
|
|
|
button:hover { |
|
transform: translateY(-2px); |
|
box-shadow: 0 4px 12px rgba(0, 255, 136, 0.3); |
|
} |
|
|
|
.code-block { |
|
background: rgba(0, 0, 0, 0.6); |
|
border: 1px solid #333; |
|
border-radius: 4px; |
|
padding: 10px; |
|
font-family: 'Courier New', monospace; |
|
font-size: 12px; |
|
margin: 10px 0; |
|
overflow-x: auto; |
|
} |
|
|
|
.log-entry { |
|
background: rgba(0, 255, 136, 0.1); |
|
border-left: 3px solid #00ff88; |
|
padding: 8px; |
|
margin: 5px 0; |
|
border-radius: 0 4px 4px 0; |
|
font-size: 12px; |
|
} |
|
|
|
input[type="range"] { |
|
width: 100%; |
|
margin: 10px 0; |
|
} |
|
|
|
.fractal-params { |
|
display: grid; |
|
grid-template-columns: 1fr 1fr; |
|
gap: 10px; |
|
margin-top: 10px; |
|
} |
|
|
|
.param-group { |
|
display: flex; |
|
flex-direction: column; |
|
gap: 5px; |
|
} |
|
|
|
label { |
|
font-size: 12px; |
|
color: #00ff88; |
|
} |
|
</style> |
|
</head> |
|
<body> |
|
<div class="dashboard"> |
|
<div class="header"> |
|
<h1>🤖 AI Agentic Control System</h1> |
|
<div> |
|
<span id="status">🟢 System Active</span> |
|
<span style="margin-left: 20px;">FPS: <span id="fps">60</span></span> |
|
</div> |
|
</div> |
|
|
|
<div class="ai-panel"> |
|
<h3>🧠 AI Agents</h3> |
|
<div id="agents-container"> |
|
|
|
</div> |
|
|
|
<h4>📊 System Logs</h4> |
|
<div id="logs-container"> |
|
|
|
</div> |
|
</div> |
|
|
|
<div class="viz-container"> |
|
<canvas id="three-canvas"></canvas> |
|
</div> |
|
|
|
<div class="ai-panel"> |
|
<h3>🔧 Dynamic Code Engine</h3> |
|
<button onclick="updateFractalCode()">🔄 Evolve Fractal</button> |
|
<button onclick="generateNewSurface()">🌊 New Surface</button> |
|
|
|
<div class="code-block" id="current-code"> |
|
// Current fractal function |
|
z = z² + c |
|
</div> |
|
|
|
<h4>🎯 Active Targets</h4> |
|
<div id="targets-list"> |
|
<div class="log-entry">Target: Web App Control</div> |
|
<div class="log-entry">Target: Fractal Evolution</div> |
|
<div class="log-entry">Target: 3D Animation</div> |
|
</div> |
|
</div> |
|
|
|
<div class="control-panel"> |
|
<div> |
|
<h4>🌀 Fractal Controls</h4> |
|
<div class="fractal-params"> |
|
<div class="param-group"> |
|
<label>Iterations:</label> |
|
<input type="range" id="iterations" min="10" max="200" value="50"> |
|
</div> |
|
<div class="param-group"> |
|
<label>Zoom:</label> |
|
<input type="range" id="zoom" min="0.1" max="5" step="0.1" value="1"> |
|
</div> |
|
<div class="param-group"> |
|
<label>C Real:</label> |
|
<input type="range" id="c-real" min="-2" max="2" step="0.01" value="-0.7"> |
|
</div> |
|
<div class="param-group"> |
|
<label>C Imag:</label> |
|
<input type="range" id="c-imag" min="-2" max="2" step="0.01" value="0.27"> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
<div> |
|
<h4>🏙️ City Controls</h4> |
|
<button onclick="addPerson()">🚶 Add Person</button> |
|
<button onclick="addVehicle()">🚗 Add Vehicle</button> |
|
<button onclick="addAnimal()">🐕 Add Animal</button> |
|
<button onclick="toggleTimeSpeed()">⏰ Time Speed</button> |
|
</div> |
|
|
|
<div> |
|
<h4>☀️ Day/Night</h4> |
|
<button onclick="forceDayTime()">☀️ Force Day</button> |
|
<button onclick="forceNightTime()">🌙 Force Night</button> |
|
<button onclick="randomizeColors()">🎨 Colors</button> |
|
<button onclick="addControlPoint()">✨ Add Orb</button> |
|
</div> |
|
|
|
<div> |
|
<h4>🚀 Agent Actions</h4> |
|
<button onclick="deployAgent('fractal')">🌀 Fractal Agent</button> |
|
<button onclick="deployAgent('visual')">👁️ Visual Agent</button> |
|
<button onclick="deployAgent('control')">🎮 Control Agent</button> |
|
<button onclick="deployAgent('browser')">🌐 Browser Agent</button> |
|
</div> |
|
|
|
<div> |
|
<h4>📡 System Status</h4> |
|
<div style="font-size: 12px;"> |
|
<div>People: <span id="people-count">8</span></div> |
|
<div>Vehicles: <span id="vehicle-count">9</span></div> |
|
<div>Animals: <span id="animal-count">11</span></div> |
|
<div>Time: <span id="time-cycle">Day</span></div> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
<script> |
|
|
|
class AIAgent { |
|
constructor(name, type, color) { |
|
this.name = name; |
|
this.type = type; |
|
this.color = color; |
|
this.status = 'idle'; |
|
this.tasks = []; |
|
this.lastUpdate = Date.now(); |
|
} |
|
|
|
execute(task) { |
|
this.status = 'active'; |
|
this.tasks.push(task); |
|
addLog(`${this.name}: Executing ${task}`); |
|
|
|
|
|
setTimeout(() => { |
|
this.status = 'idle'; |
|
addLog(`${this.name}: Completed ${task}`); |
|
}, Math.random() * 2000 + 1000); |
|
} |
|
} |
|
|
|
|
|
const agents = [ |
|
new AIAgent('Fractal-AI', 'computation', '#00ff88'), |
|
new AIAgent('Visual-AI', 'graphics', '#ff6b6b'), |
|
new AIAgent('Control-AI', 'interface', '#4ecdc4'), |
|
new AIAgent('Browser-AI', 'automation', '#45b7d1') |
|
]; |
|
|
|
|
|
let scene, camera, renderer, fractalMesh, controlPoints = []; |
|
let animationId; |
|
let isAnimating = true; |
|
|
|
|
|
let buildings = []; |
|
let people = []; |
|
let vehicles = []; |
|
let animals = []; |
|
let dayNightCycle = { time: 0, sunLight: null, moonLight: null, ambientLight: null }; |
|
|
|
function initThreeJS() { |
|
const container = document.getElementById('three-canvas'); |
|
const rect = container.parentElement.getBoundingClientRect(); |
|
|
|
scene = new THREE.Scene(); |
|
camera = new THREE.PerspectiveCamera(75, rect.width / rect.height, 0.1, 1000); |
|
renderer = new THREE.WebGLRenderer({ canvas: container, alpha: true }); |
|
renderer.setSize(rect.width, rect.height); |
|
renderer.setClearColor(0x87CEEB, 1.0); |
|
renderer.shadowMap.enabled = true; |
|
renderer.shadowMap.type = THREE.PCFSoftShadowMap; |
|
|
|
|
|
setupLighting(); |
|
|
|
|
|
createCity(); |
|
createPeople(); |
|
createVehicles(); |
|
createAnimals(); |
|
|
|
|
|
createFractalSurface(); |
|
|
|
camera.position.set(0, 8, 12); |
|
camera.lookAt(0, 0, 0); |
|
|
|
animate(); |
|
} |
|
|
|
function setupLighting() { |
|
|
|
dayNightCycle.ambientLight = new THREE.AmbientLight(0x404040, 0.3); |
|
scene.add(dayNightCycle.ambientLight); |
|
|
|
|
|
dayNightCycle.sunLight = new THREE.DirectionalLight(0xffffff, 1.0); |
|
dayNightCycle.sunLight.position.set(10, 10, 5); |
|
dayNightCycle.sunLight.castShadow = true; |
|
dayNightCycle.sunLight.shadow.mapSize.width = 2048; |
|
dayNightCycle.sunLight.shadow.mapSize.height = 2048; |
|
scene.add(dayNightCycle.sunLight); |
|
|
|
|
|
dayNightCycle.moonLight = new THREE.DirectionalLight(0x6666ff, 0.3); |
|
dayNightCycle.moonLight.position.set(-10, 8, -5); |
|
dayNightCycle.moonLight.castShadow = true; |
|
dayNightCycle.moonLight.visible = false; |
|
scene.add(dayNightCycle.moonLight); |
|
} |
|
|
|
function createCity() { |
|
|
|
const groundGeometry = new THREE.PlaneGeometry(20, 20); |
|
const groundMaterial = new THREE.MeshLambertMaterial({ color: 0x444444 }); |
|
const ground = new THREE.Mesh(groundGeometry, groundMaterial); |
|
ground.rotation.x = -Math.PI / 2; |
|
ground.receiveShadow = true; |
|
scene.add(ground); |
|
|
|
|
|
for (let i = 0; i < 12; i++) { |
|
createBuilding( |
|
(Math.random() - 0.5) * 15, |
|
0, |
|
(Math.random() - 0.5) * 15 |
|
); |
|
} |
|
|
|
|
|
createStreets(); |
|
} |
|
|
|
function createBuilding(x, y, z) { |
|
const height = Math.random() * 4 + 2; |
|
const width = Math.random() * 1.5 + 1; |
|
const depth = Math.random() * 1.5 + 1; |
|
|
|
|
|
const buildingGeometry = new THREE.BoxGeometry(width, height, depth); |
|
const buildingMaterial = new THREE.MeshLambertMaterial({ |
|
color: new THREE.Color().setHSL(Math.random() * 0.1 + 0.15, 0.3, 0.4) |
|
}); |
|
const building = new THREE.Mesh(buildingGeometry, buildingMaterial); |
|
building.position.set(x, height / 2, z); |
|
building.castShadow = true; |
|
building.receiveShadow = true; |
|
scene.add(building); |
|
|
|
|
|
const windows = []; |
|
const windowsX = Math.floor(width * 4); |
|
const windowsY = Math.floor(height * 3); |
|
|
|
for (let wx = 0; wx < windowsX; wx++) { |
|
for (let wy = 0; wy < windowsY; wy++) { |
|
const windowGeometry = new THREE.PlaneGeometry(0.15, 0.15); |
|
const windowMaterial = new THREE.MeshBasicMaterial({ |
|
color: 0x444444, |
|
transparent: true, |
|
opacity: 0.8 |
|
}); |
|
const window = new THREE.Mesh(windowGeometry, windowMaterial); |
|
|
|
window.position.set( |
|
x + (wx - windowsX/2) * 0.2, |
|
y + (wy - windowsY/2) * 0.3 + height/2, |
|
z + width/2 + 0.01 |
|
); |
|
|
|
window.userData = { |
|
isOn: Math.random() > 0.5, |
|
flickerTimer: Math.random() * 1000 |
|
}; |
|
|
|
windows.push(window); |
|
scene.add(window); |
|
} |
|
} |
|
|
|
buildings.push({ structure: building, windows: windows }); |
|
} |
|
|
|
function createStreets() { |
|
|
|
const streetMaterial = new THREE.MeshLambertMaterial({ color: 0x333333 }); |
|
|
|
|
|
const hStreetGeometry = new THREE.PlaneGeometry(20, 1); |
|
const hStreet = new THREE.Mesh(hStreetGeometry, streetMaterial); |
|
hStreet.rotation.x = -Math.PI / 2; |
|
hStreet.position.y = 0.01; |
|
scene.add(hStreet); |
|
|
|
|
|
const vStreetGeometry = new THREE.PlaneGeometry(1, 20); |
|
const vStreet = new THREE.Mesh(vStreetGeometry, streetMaterial); |
|
vStreet.rotation.x = -Math.PI / 2; |
|
vStreet.position.y = 0.01; |
|
scene.add(vStreet); |
|
} |
|
|
|
function createPeople() { |
|
for (let i = 0; i < 8; i++) { |
|
const person = createPerson(); |
|
people.push(person); |
|
scene.add(person.group); |
|
} |
|
} |
|
|
|
function createPerson() { |
|
const group = new THREE.Group(); |
|
|
|
|
|
const bodyGeometry = new THREE.CylinderGeometry(0.1, 0.15, 0.4); |
|
const bodyMaterial = new THREE.MeshLambertMaterial({ |
|
color: new THREE.Color().setHSL(Math.random(), 0.6, 0.5) |
|
}); |
|
const body = new THREE.Mesh(bodyGeometry, bodyMaterial); |
|
body.position.y = 0.4; |
|
group.add(body); |
|
|
|
|
|
const headGeometry = new THREE.SphereGeometry(0.08); |
|
const headMaterial = new THREE.MeshLambertMaterial({ color: 0xffdbac }); |
|
const head = new THREE.Mesh(headGeometry, headMaterial); |
|
head.position.y = 0.7; |
|
group.add(head); |
|
|
|
|
|
const path = createRandomPath(); |
|
group.position.copy(path[0]); |
|
group.castShadow = true; |
|
|
|
return { |
|
group: group, |
|
path: path, |
|
pathIndex: 0, |
|
speed: Math.random() * 0.02 + 0.01, |
|
walkCycle: 0 |
|
}; |
|
} |
|
|
|
function createVehicles() { |
|
|
|
for (let i = 0; i < 4; i++) { |
|
const car = createCar(); |
|
vehicles.push(car); |
|
scene.add(car.group); |
|
} |
|
|
|
|
|
for (let i = 0; i < 2; i++) { |
|
const truck = createTruck(); |
|
vehicles.push(truck); |
|
scene.add(truck.group); |
|
} |
|
|
|
|
|
for (let i = 0; i < 3; i++) { |
|
const bicycle = createBicycle(); |
|
vehicles.push(bicycle); |
|
scene.add(bicycle.group); |
|
} |
|
} |
|
|
|
function createCar() { |
|
const group = new THREE.Group(); |
|
|
|
|
|
const bodyGeometry = new THREE.BoxGeometry(0.8, 0.3, 0.4); |
|
const bodyMaterial = new THREE.MeshLambertMaterial({ |
|
color: new THREE.Color().setHSL(Math.random(), 0.8, 0.5) |
|
}); |
|
const body = new THREE.Mesh(bodyGeometry, bodyMaterial); |
|
body.position.y = 0.2; |
|
group.add(body); |
|
|
|
|
|
const wheelGeometry = new THREE.CylinderGeometry(0.08, 0.08, 0.05); |
|
const wheelMaterial = new THREE.MeshLambertMaterial({ color: 0x222222 }); |
|
|
|
const wheels = []; |
|
const wheelPositions = [ |
|
[-0.3, 0.08, -0.15], [0.3, 0.08, -0.15], |
|
[-0.3, 0.08, 0.15], [0.3, 0.08, 0.15] |
|
]; |
|
|
|
wheelPositions.forEach(pos => { |
|
const wheel = new THREE.Mesh(wheelGeometry, wheelMaterial); |
|
wheel.position.set(...pos); |
|
wheel.rotation.z = Math.PI / 2; |
|
wheels.push(wheel); |
|
group.add(wheel); |
|
}); |
|
|
|
const path = createVehiclePath(); |
|
group.position.copy(path[0]); |
|
group.castShadow = true; |
|
|
|
return { |
|
group: group, |
|
wheels: wheels, |
|
path: path, |
|
pathIndex: 0, |
|
speed: Math.random() * 0.05 + 0.03, |
|
type: 'car' |
|
}; |
|
} |
|
|
|
function createTruck() { |
|
const group = new THREE.Group(); |
|
|
|
|
|
const bodyGeometry = new THREE.BoxGeometry(1.2, 0.5, 0.6); |
|
const bodyMaterial = new THREE.MeshLambertMaterial({ color: 0x8B4513 }); |
|
const body = new THREE.Mesh(bodyGeometry, bodyMaterial); |
|
body.position.y = 0.3; |
|
group.add(body); |
|
|
|
|
|
const cabGeometry = new THREE.BoxGeometry(0.4, 0.4, 0.6); |
|
const cabMaterial = new THREE.MeshLambertMaterial({ color: 0x654321 }); |
|
const cab = new THREE.Mesh(cabGeometry, cabMaterial); |
|
cab.position.set(-0.5, 0.4, 0); |
|
group.add(cab); |
|
|
|
const path = createVehiclePath(); |
|
group.position.copy(path[0]); |
|
group.castShadow = true; |
|
|
|
return { |
|
group: group, |
|
path: path, |
|
pathIndex: 0, |
|
speed: Math.random() * 0.03 + 0.02, |
|
type: 'truck' |
|
}; |
|
} |
|
|
|
function createBicycle() { |
|
const group = new THREE.Group(); |
|
|
|
|
|
const frameGeometry = new THREE.CylinderGeometry(0.02, 0.02, 0.6); |
|
const frameMaterial = new THREE.MeshLambertMaterial({ color: 0x0066cc }); |
|
const frame = new THREE.Mesh(frameGeometry, frameMaterial); |
|
frame.position.y = 0.15; |
|
frame.rotation.z = Math.PI / 6; |
|
group.add(frame); |
|
|
|
|
|
const wheelGeometry = new THREE.TorusGeometry(0.12, 0.02, 8, 16); |
|
const wheelMaterial = new THREE.MeshLambertMaterial({ color: 0x333333 }); |
|
|
|
const frontWheel = new THREE.Mesh(wheelGeometry, wheelMaterial); |
|
frontWheel.position.set(0.3, 0.12, 0); |
|
group.add(frontWheel); |
|
|
|
const backWheel = new THREE.Mesh(wheelGeometry, wheelMaterial); |
|
backWheel.position.set(-0.3, 0.12, 0); |
|
group.add(backWheel); |
|
|
|
const path = createRandomPath(); |
|
group.position.copy(path[0]); |
|
group.castShadow = true; |
|
|
|
return { |
|
group: group, |
|
wheels: [frontWheel, backWheel], |
|
path: path, |
|
pathIndex: 0, |
|
speed: Math.random() * 0.04 + 0.02, |
|
type: 'bicycle' |
|
}; |
|
} |
|
|
|
function createAnimals() { |
|
|
|
for (let i = 0; i < 3; i++) { |
|
const dog = createDog(); |
|
animals.push(dog); |
|
scene.add(dog.group); |
|
} |
|
|
|
|
|
for (let i = 0; i < 2; i++) { |
|
const cat = createCat(); |
|
animals.push(cat); |
|
scene.add(cat.group); |
|
} |
|
|
|
|
|
for (let i = 0; i < 6; i++) { |
|
const bird = createBird(); |
|
animals.push(bird); |
|
scene.add(bird.group); |
|
} |
|
} |
|
|
|
function createDog() { |
|
const group = new THREE.Group(); |
|
|
|
|
|
const bodyGeometry = new THREE.BoxGeometry(0.3, 0.15, 0.15); |
|
const bodyMaterial = new THREE.MeshLambertMaterial({ color: 0x8B4513 }); |
|
const body = new THREE.Mesh(bodyGeometry, bodyMaterial); |
|
body.position.y = 0.1; |
|
group.add(body); |
|
|
|
|
|
const headGeometry = new THREE.BoxGeometry(0.12, 0.1, 0.1); |
|
const head = new THREE.Mesh(headGeometry, bodyMaterial); |
|
head.position.set(0.2, 0.12, 0); |
|
group.add(head); |
|
|
|
|
|
const tailGeometry = new THREE.CylinderGeometry(0.02, 0.02, 0.1); |
|
const tail = new THREE.Mesh(tailGeometry, bodyMaterial); |
|
tail.position.set(-0.15, 0.15, 0); |
|
tail.rotation.z = Math.PI / 4; |
|
group.add(tail); |
|
|
|
const path = createRandomPath(); |
|
group.position.copy(path[0]); |
|
group.castShadow = true; |
|
|
|
return { |
|
group: group, |
|
tail: tail, |
|
path: path, |
|
pathIndex: 0, |
|
speed: Math.random() * 0.03 + 0.02, |
|
type: 'dog', |
|
tailWag: 0 |
|
}; |
|
} |
|
|
|
function createCat() { |
|
const group = new THREE.Group(); |
|
|
|
|
|
const bodyGeometry = new THREE.BoxGeometry(0.25, 0.1, 0.1); |
|
const bodyMaterial = new THREE.MeshLambertMaterial({ color: 0x696969 }); |
|
const body = new THREE.Mesh(bodyGeometry, bodyMaterial); |
|
body.position.y = 0.08; |
|
group.add(body); |
|
|
|
|
|
const headGeometry = new THREE.SphereGeometry(0.05); |
|
const head = new THREE.Mesh(headGeometry, bodyMaterial); |
|
head.position.set(0.15, 0.1, 0); |
|
group.add(head); |
|
|
|
const path = createRandomPath(); |
|
group.position.copy(path[0]); |
|
group.castShadow = true; |
|
|
|
return { |
|
group: group, |
|
path: path, |
|
pathIndex: 0, |
|
speed: Math.random() * 0.025 + 0.015, |
|
type: 'cat' |
|
}; |
|
} |
|
|
|
function createBird() { |
|
const group = new THREE.Group(); |
|
|
|
|
|
const bodyGeometry = new THREE.SphereGeometry(0.04); |
|
const bodyMaterial = new THREE.MeshLambertMaterial({ |
|
color: new THREE.Color().setHSL(Math.random(), 0.7, 0.6) |
|
}); |
|
const body = new THREE.Mesh(bodyGeometry, bodyMaterial); |
|
group.add(body); |
|
|
|
|
|
const wingGeometry = new THREE.PlaneGeometry(0.08, 0.03); |
|
const wingMaterial = new THREE.MeshLambertMaterial({ |
|
color: bodyMaterial.color, |
|
transparent: true, |
|
opacity: 0.8 |
|
}); |
|
|
|
const leftWing = new THREE.Mesh(wingGeometry, wingMaterial); |
|
leftWing.position.set(-0.05, 0, 0); |
|
leftWing.rotation.z = Math.PI / 6; |
|
group.add(leftWing); |
|
|
|
const rightWing = new THREE.Mesh(wingGeometry, wingMaterial); |
|
rightWing.position.set(0.05, 0, 0); |
|
rightWing.rotation.z = -Math.PI / 6; |
|
group.add(rightWing); |
|
|
|
group.position.set( |
|
(Math.random() - 0.5) * 15, |
|
Math.random() * 3 + 2, |
|
(Math.random() - 0.5) * 15 |
|
); |
|
|
|
return { |
|
group: group, |
|
wings: [leftWing, rightWing], |
|
flightPath: Math.random() * Math.PI * 2, |
|
flightRadius: Math.random() * 5 + 2, |
|
height: group.position.y, |
|
speed: Math.random() * 0.02 + 0.01, |
|
wingFlap: 0, |
|
type: 'bird' |
|
}; |
|
} |
|
|
|
function createRandomPath() { |
|
const path = []; |
|
for (let i = 0; i < 6; i++) { |
|
path.push(new THREE.Vector3( |
|
(Math.random() - 0.5) * 15, |
|
0, |
|
(Math.random() - 0.5) * 15 |
|
)); |
|
} |
|
return path; |
|
} |
|
|
|
function createVehiclePath() { |
|
|
|
const paths = [ |
|
|
|
[ |
|
new THREE.Vector3(-10, 0, 0), |
|
new THREE.Vector3(10, 0, 0) |
|
], |
|
|
|
[ |
|
new THREE.Vector3(0, 0, -10), |
|
new THREE.Vector3(0, 0, 10) |
|
] |
|
]; |
|
return paths[Math.floor(Math.random() * paths.length)]; |
|
} |
|
|
|
function createFractalSurface() { |
|
const geometry = new THREE.PlaneGeometry(2, 2, 32, 32); |
|
const vertices = geometry.attributes.position.array; |
|
|
|
|
|
for (let i = 0; i < vertices.length; i += 3) { |
|
const x = vertices[i]; |
|
const y = vertices[i + 1]; |
|
|
|
|
|
const c_real = parseFloat(document.getElementById('c-real')?.value || -0.7); |
|
const c_imag = parseFloat(document.getElementById('c-imag')?.value || 0.27); |
|
const zoom = parseFloat(document.getElementById('zoom')?.value || 1); |
|
|
|
let z_real = x * zoom; |
|
let z_imag = y * zoom; |
|
let iterations = 0; |
|
const maxIter = parseInt(document.getElementById('iterations')?.value || 50); |
|
|
|
while (z_real * z_real + z_imag * z_imag < 4 && iterations < maxIter) { |
|
const temp = z_real * z_real - z_imag * z_imag + c_real; |
|
z_imag = 2 * z_real * z_imag + c_imag; |
|
z_real = temp; |
|
iterations++; |
|
} |
|
|
|
vertices[i + 2] = (iterations / maxIter) * 0.3 * Math.sin(Date.now() * 0.001 + x + y); |
|
} |
|
|
|
geometry.attributes.position.needsUpdate = true; |
|
geometry.computeVertexNormals(); |
|
|
|
|
|
const material = new THREE.MeshPhongMaterial({ |
|
color: new THREE.Color().setHSL((Date.now() * 0.0001) % 1, 0.7, 0.6), |
|
wireframe: false, |
|
transparent: true, |
|
opacity: 0.6 |
|
}); |
|
|
|
if (fractalMesh) { |
|
scene.remove(fractalMesh); |
|
} |
|
|
|
fractalMesh = new THREE.Mesh(geometry, material); |
|
fractalMesh.position.set(5, 0.5, 5); |
|
fractalMesh.rotation.x = -Math.PI / 2; |
|
scene.add(fractalMesh); |
|
} |
|
|
|
function updateDayNightCycle() { |
|
dayNightCycle.time += 0.001; |
|
const cycle = (Math.sin(dayNightCycle.time) + 1) / 2; |
|
|
|
|
|
const sunAngle = dayNightCycle.time; |
|
const sunRadius = 15; |
|
dayNightCycle.sunLight.position.set( |
|
Math.cos(sunAngle) * sunRadius, |
|
Math.sin(sunAngle) * sunRadius, |
|
5 |
|
); |
|
|
|
|
|
const moonAngle = sunAngle + Math.PI; |
|
dayNightCycle.moonLight.position.set( |
|
Math.cos(moonAngle) * sunRadius, |
|
Math.sin(moonAngle) * sunRadius, |
|
-5 |
|
); |
|
|
|
|
|
if (cycle > 0.5) { |
|
|
|
dayNightCycle.sunLight.visible = true; |
|
dayNightCycle.moonLight.visible = false; |
|
dayNightCycle.sunLight.intensity = cycle; |
|
dayNightCycle.ambientLight.intensity = cycle * 0.5; |
|
|
|
|
|
const skyHue = 0.55; |
|
const skySaturation = 0.6; |
|
const skyLightness = 0.4 + cycle * 0.4; |
|
renderer.setClearColor(new THREE.Color().setHSL(skyHue, skySaturation, skyLightness)); |
|
} else { |
|
|
|
dayNightCycle.sunLight.visible = false; |
|
dayNightCycle.moonLight.visible = true; |
|
dayNightCycle.moonLight.intensity = (1 - cycle) * 0.3; |
|
dayNightCycle.ambientLight.intensity = (1 - cycle) * 0.2; |
|
|
|
|
|
const skyHue = 0.65; |
|
const skySaturation = 0.8; |
|
const skyLightness = 0.1 + (1 - cycle) * 0.1; |
|
renderer.setClearColor(new THREE.Color().setHSL(skyHue, skySaturation, skyLightness)); |
|
} |
|
} |
|
|
|
function updateBuildingWindows() { |
|
const isNight = (Math.sin(dayNightCycle.time) + 1) / 2 < 0.5; |
|
|
|
buildings.forEach(building => { |
|
building.windows.forEach(window => { |
|
window.userData.flickerTimer += 16; |
|
|
|
|
|
const lightProbability = isNight ? 0.7 : 0.2; |
|
|
|
if (window.userData.flickerTimer > 1000 + Math.random() * 2000) { |
|
window.userData.isOn = Math.random() < lightProbability; |
|
window.userData.flickerTimer = 0; |
|
} |
|
|
|
if (window.userData.isOn) { |
|
const warmth = Math.random() * 0.1 + 0.1; |
|
window.material.color.setHSL(warmth, 0.8, 0.6); |
|
window.material.opacity = 0.9; |
|
} else { |
|
window.material.color.setRGB(0.2, 0.2, 0.3); |
|
window.material.opacity = 0.3; |
|
} |
|
}); |
|
}); |
|
} |
|
|
|
function updatePeople() { |
|
people.forEach(person => { |
|
const path = person.path; |
|
const currentPos = path[person.pathIndex]; |
|
const nextPos = path[(person.pathIndex + 1) % path.length]; |
|
|
|
|
|
const direction = new THREE.Vector3().subVectors(nextPos, currentPos).normalize(); |
|
person.group.position.add(direction.multiplyScalar(person.speed)); |
|
|
|
|
|
person.group.lookAt(person.group.position.clone().add(direction)); |
|
|
|
|
|
person.walkCycle += 0.3; |
|
person.group.children[0].rotation.z = Math.sin(person.walkCycle) * 0.1; |
|
|
|
|
|
if (person.group.position.distanceTo(nextPos) < 0.2) { |
|
person.pathIndex = (person.pathIndex + 1) % path.length; |
|
} |
|
}); |
|
} |
|
|
|
function updateVehicles() { |
|
vehicles.forEach(vehicle => { |
|
const path = vehicle.path; |
|
const currentPos = path[vehicle.pathIndex]; |
|
const nextPos = path[(vehicle.pathIndex + 1) % path.length]; |
|
|
|
|
|
const direction = new THREE.Vector3().subVectors(nextPos, currentPos).normalize(); |
|
vehicle.group.position.add(direction.multiplyScalar(vehicle.speed)); |
|
|
|
|
|
vehicle.group.lookAt(vehicle.group.position.clone().add(direction)); |
|
|
|
|
|
if (vehicle.wheels) { |
|
vehicle.wheels.forEach(wheel => { |
|
wheel.rotation.x += vehicle.speed * 2; |
|
}); |
|
} |
|
|
|
|
|
if (vehicle.group.position.distanceTo(nextPos) < 0.2) { |
|
vehicle.pathIndex = (vehicle.pathIndex + 1) % path.length; |
|
} |
|
}); |
|
} |
|
|
|
function updateAnimals() { |
|
animals.forEach(animal => { |
|
if (animal.type === 'bird') { |
|
|
|
animal.flightPath += animal.speed; |
|
animal.group.position.x = Math.cos(animal.flightPath) * animal.flightRadius; |
|
animal.group.position.z = Math.sin(animal.flightPath) * animal.flightRadius; |
|
animal.group.position.y = animal.height + Math.sin(animal.flightPath * 3) * 0.5; |
|
|
|
|
|
animal.wingFlap += 0.5; |
|
const flapAngle = Math.sin(animal.wingFlap) * 0.5; |
|
animal.wings[0].rotation.z = Math.PI / 6 + flapAngle; |
|
animal.wings[1].rotation.z = -Math.PI / 6 - flapAngle; |
|
|
|
|
|
const flightDirection = new THREE.Vector3( |
|
-Math.sin(animal.flightPath), |
|
0, |
|
Math.cos(animal.flightPath) |
|
); |
|
animal.group.lookAt(animal.group.position.clone().add(flightDirection)); |
|
|
|
} else { |
|
|
|
const path = animal.path; |
|
const currentPos = path[animal.pathIndex]; |
|
const nextPos = path[(animal.pathIndex + 1) % path.length]; |
|
|
|
const direction = new THREE.Vector3().subVectors(nextPos, currentPos).normalize(); |
|
animal.group.position.add(direction.multiplyScalar(animal.speed)); |
|
animal.group.lookAt(animal.group.position.clone().add(direction)); |
|
|
|
|
|
if (animal.type === 'dog' && animal.tail) { |
|
animal.tailWag += 0.4; |
|
animal.tail.rotation.y = Math.sin(animal.tailWag) * 0.5; |
|
} |
|
|
|
if (animal.group.position.distanceTo(nextPos) < 0.1) { |
|
animal.pathIndex = (animal.pathIndex + 1) % path.length; |
|
} |
|
} |
|
}); |
|
} |
|
|
|
function addControlPoint() { |
|
const geometry = new THREE.SphereGeometry(0.1, 16, 16); |
|
const material = new THREE.MeshPhongMaterial({ |
|
color: new THREE.Color().setHSL(Math.random(), 0.8, 0.6), |
|
emissive: new THREE.Color().setHSL(Math.random(), 0.3, 0.1) |
|
}); |
|
|
|
const sphere = new THREE.Mesh(geometry, material); |
|
sphere.position.set( |
|
(Math.random() - 0.5) * 16, |
|
Math.random() * 4 + 2, |
|
(Math.random() - 0.5) * 16 |
|
); |
|
|
|
sphere.userData = { |
|
velocity: new THREE.Vector3( |
|
(Math.random() - 0.5) * 0.03, |
|
(Math.random() - 0.5) * 0.02, |
|
(Math.random() - 0.5) * 0.03 |
|
) |
|
}; |
|
|
|
sphere.castShadow = true; |
|
controlPoints.push(sphere); |
|
scene.add(sphere); |
|
|
|
addLog(`Control point added at (${sphere.position.x.toFixed(2)}, ${sphere.position.y.toFixed(2)})`); |
|
} |
|
|
|
function addPerson() { |
|
const person = createPerson(); |
|
people.push(person); |
|
scene.add(person.group); |
|
addLog(`New person added to city`); |
|
} |
|
|
|
function addVehicle() { |
|
const vehicleType = ['car', 'truck', 'bicycle'][Math.floor(Math.random() * 3)]; |
|
let vehicle; |
|
|
|
if (vehicleType === 'car') vehicle = createCar(); |
|
else if (vehicleType === 'truck') vehicle = createTruck(); |
|
else vehicle = createBicycle(); |
|
|
|
vehicles.push(vehicle); |
|
scene.add(vehicle.group); |
|
addLog(`New ${vehicleType} added to streets`); |
|
} |
|
|
|
function addAnimal() { |
|
const animalType = ['dog', 'cat', 'bird'][Math.floor(Math.random() * 3)]; |
|
let animal; |
|
|
|
if (animalType === 'dog') animal = createDog(); |
|
else if (animalType === 'cat') animal = createCat(); |
|
else animal = createBird(); |
|
|
|
animals.push(animal); |
|
scene.add(animal.group); |
|
addLog(`New ${animalType} spotted in city`); |
|
} |
|
|
|
function toggleTimeSpeed() { |
|
const currentSpeed = 0.001; |
|
dayNightCycle.timeSpeed = dayNightCycle.timeSpeed === currentSpeed ? currentSpeed * 5 : currentSpeed; |
|
addLog(`Time speed: ${dayNightCycle.timeSpeed === currentSpeed ? 'Normal' : '5x Fast'}`); |
|
} |
|
|
|
function forceDayTime() { |
|
dayNightCycle.time = Math.PI / 2; |
|
addLog('Forced to day time'); |
|
} |
|
|
|
function forceNightTime() { |
|
dayNightCycle.time = -Math.PI / 2; |
|
addLog('Forced to night time'); |
|
} |
|
|
|
function clearControlPoints() { |
|
controlPoints.forEach(point => scene.remove(point)); |
|
controlPoints = []; |
|
addLog('All control points cleared'); |
|
} |
|
|
|
function animate() { |
|
if (!isAnimating) return; |
|
|
|
animationId = requestAnimationFrame(animate); |
|
|
|
|
|
updateDayNightCycle(); |
|
|
|
|
|
updateBuildingWindows(); |
|
|
|
|
|
updatePeople(); |
|
updateVehicles(); |
|
updateAnimals(); |
|
|
|
|
|
if (fractalMesh) { |
|
fractalMesh.rotation.z += 0.002; |
|
fractalMesh.material.color.setHSL((Date.now() * 0.0001) % 1, 0.7, 0.6); |
|
} |
|
|
|
|
|
controlPoints.forEach(point => { |
|
point.position.add(point.userData.velocity); |
|
|
|
|
|
if (Math.abs(point.position.x) > 8) point.userData.velocity.x *= -1; |
|
if (Math.abs(point.position.y - 2) > 4) point.userData.velocity.y *= -1; |
|
if (Math.abs(point.position.z) > 8) point.userData.velocity.z *= -1; |
|
|
|
|
|
point.rotation.x += 0.02; |
|
point.rotation.y += 0.03; |
|
}); |
|
|
|
renderer.render(scene, camera); |
|
|
|
|
|
updateFPS(); |
|
} |
|
|
|
let lastTime = Date.now(); |
|
let frameCount = 0; |
|
|
|
function updateFPS() { |
|
frameCount++; |
|
const now = Date.now(); |
|
if (now - lastTime >= 1000) { |
|
document.getElementById('fps').textContent = frameCount; |
|
frameCount = 0; |
|
lastTime = now; |
|
} |
|
} |
|
|
|
|
|
const fractalFunctions = [ |
|
"z = z² + c", |
|
"z = z³ + c", |
|
"z = sin(z) + c", |
|
"z = |z|² + c", |
|
"z = z² + c + sin(t)", |
|
"z = z*cos(z) + c", |
|
"z = exp(z) + c" |
|
]; |
|
|
|
function updateFractalCode() { |
|
const newFunction = fractalFunctions[Math.floor(Math.random() * fractalFunctions.length)]; |
|
document.getElementById('current-code').innerHTML = `// Current fractal function<br/>${newFunction}`; |
|
|
|
createFractalSurface(); |
|
agents[0].execute('fractal code evolution'); |
|
addLog(`Fractal function updated: ${newFunction}`); |
|
} |
|
|
|
function generateNewSurface() { |
|
|
|
document.getElementById('c-real').value = (Math.random() - 0.5) * 4; |
|
document.getElementById('c-imag').value = (Math.random() - 0.5) * 4; |
|
document.getElementById('zoom').value = Math.random() * 3 + 0.5; |
|
|
|
createFractalSurface(); |
|
agents[1].execute('surface generation'); |
|
} |
|
|
|
function toggleAnimation() { |
|
isAnimating = !isAnimating; |
|
if (isAnimating) { |
|
animate(); |
|
addLog('Animation resumed'); |
|
} else { |
|
cancelAnimationFrame(animationId); |
|
addLog('Animation paused'); |
|
} |
|
} |
|
|
|
function randomizeColors() { |
|
if (fractalMesh) { |
|
fractalMesh.material.color.setHSL(Math.random(), 0.7, 0.6); |
|
} |
|
controlPoints.forEach(point => { |
|
point.material.color.setHSL(Math.random(), 0.8, 0.6); |
|
point.material.emissive.setHSL(Math.random(), 0.3, 0.1); |
|
}); |
|
agents[1].execute('color randomization'); |
|
} |
|
|
|
function deployAgent(type) { |
|
const agent = agents.find(a => a.type === type || a.name.toLowerCase().includes(type)); |
|
if (agent) { |
|
const tasks = { |
|
fractal: 'fractal computation optimization', |
|
visual: 'visual enhancement protocol', |
|
control: 'interface adaptation', |
|
browser: 'web application orchestration' |
|
}; |
|
agent.execute(tasks[type] || 'general task execution'); |
|
} |
|
} |
|
|
|
|
|
function renderAgents() { |
|
const container = document.getElementById('agents-container'); |
|
container.innerHTML = ''; |
|
|
|
agents.forEach(agent => { |
|
const card = document.createElement('div'); |
|
card.className = 'agent-card'; |
|
card.innerHTML = ` |
|
<div> |
|
<span class="agent-status ${agent.status}"></span> |
|
<strong>${agent.name}</strong> |
|
</div> |
|
<div style="font-size: 12px; color: ${agent.color};"> |
|
${agent.type.toUpperCase()} • ${agent.tasks.length} tasks |
|
</div> |
|
`; |
|
container.appendChild(card); |
|
}); |
|
} |
|
|
|
function addLog(message) { |
|
const container = document.getElementById('logs-container'); |
|
const entry = document.createElement('div'); |
|
entry.className = 'log-entry'; |
|
entry.innerHTML = `<small>${new Date().toLocaleTimeString()}</small><br/>${message}`; |
|
container.appendChild(entry); |
|
|
|
|
|
while (container.children.length > 10) { |
|
container.removeChild(container.firstChild); |
|
} |
|
|
|
container.scrollTop = container.scrollHeight; |
|
} |
|
|
|
function updateSystemStats() { |
|
document.getElementById('memory-usage').textContent = `${Math.floor(Math.random() * 30 + 40)}%`; |
|
document.getElementById('cpu-usage').textContent = `${Math.floor(Math.random() * 40 + 20)}%`; |
|
document.getElementById('agent-count').textContent = agents.length; |
|
document.getElementById('target-count').textContent = document.querySelectorAll('#targets-list .log-entry').length; |
|
} |
|
|
|
|
|
document.getElementById('iterations')?.addEventListener('input', createFractalSurface); |
|
document.getElementById('zoom')?.addEventListener('input', createFractalSurface); |
|
document.getElementById('c-real')?.addEventListener('input', createFractalSurface); |
|
document.getElementById('c-imag')?.addEventListener('input', createFractalSurface); |
|
|
|
|
|
window.addEventListener('load', () => { |
|
initThreeJS(); |
|
renderAgents(); |
|
|
|
|
|
for (let i = 0; i < 3; i++) { |
|
setTimeout(() => addControlPoint(), i * 500); |
|
} |
|
|
|
|
|
setInterval(updateSystemStats, 2000); |
|
setInterval(renderAgents, 1000); |
|
|
|
|
|
setInterval(() => { |
|
if (Math.random() < 0.1) { |
|
updateFractalCode(); |
|
} |
|
}, 5000); |
|
|
|
addLog('AI Agentic System initialized'); |
|
addLog('3D visualization engine active'); |
|
addLog('Dynamic fractal computation online'); |
|
addLog('Browser automation ready'); |
|
}); |
|
|
|
|
|
window.addEventListener('resize', () => { |
|
const container = document.getElementById('three-canvas'); |
|
const rect = container.parentElement.getBoundingClientRect(); |
|
camera.aspect = rect.width / rect.height; |
|
camera.updateProjectionMatrix(); |
|
renderer.setSize(rect.width, rect.height); |
|
}); |
|
|
|
|
|
function simulateBrowserAutomation() { |
|
const actions = [ |
|
'Opening new browser window', |
|
'Navigating to target application', |
|
'Injecting control scripts', |
|
'Establishing WebSocket connection', |
|
'Monitoring DOM changes', |
|
'Executing automated interactions' |
|
]; |
|
|
|
let index = 0; |
|
const interval = setInterval(() => { |
|
if (index < actions.length) { |
|
addLog(`Browser Agent: ${actions[index]}`); |
|
index++; |
|
} else { |
|
clearInterval(interval); |
|
addLog('Browser automation sequence complete'); |
|
} |
|
}, 1500); |
|
} |
|
|
|
|
|
function simulateAIInference() { |
|
const models = ['text-classification', 'object-detection', 'sentiment-analysis', 'code-generation']; |
|
const model = models[Math.floor(Math.random() * models.length)]; |
|
|
|
addLog(`Running ${model} inference...`); |
|
setTimeout(() => { |
|
addLog(`${model} inference complete: confidence 0.${Math.floor(Math.random() * 30 + 70)}`); |
|
}, Math.random() * 2000 + 500); |
|
} |
|
|
|
|
|
setInterval(simulateAIInference, 8000); |
|
setTimeout(simulateBrowserAutomation, 3000); |
|
</script> |
|
</body> |
|
</html> |