enterprise-audio-intelligence / frontend /src /components /three /AudioIntelligenceScene.tsx
Akbub's picture
deploy: Nexus AI v0.2.0 - SAP C4C Lead Creation UI included in fresh frontend build
d1f3f31
Raw
History Blame Contribute Delete
4.86 kB
'use client';
import { useRef, useMemo } from 'react';
import { Canvas, useFrame, useThree } from '@react-three/fiber';
import { Float } from '@react-three/drei';
import * as THREE from 'three';
function usePointerParallax(intensity = 0.35) {
const { camera } = useThree();
const target = useRef({ x: 0, y: 0 });
useFrame((state) => {
const px = state.pointer.x * intensity;
const py = state.pointer.y * intensity * 0.6;
target.current.x += (px - target.current.x) * 0.06;
target.current.y += (py - target.current.y) * 0.06;
camera.position.x = target.current.x;
camera.position.y = target.current.y;
camera.lookAt(0, 0, 0);
});
}
function IntelligenceCore() {
const coreRef = useRef<THREE.Mesh>(null);
const ringRef = useRef<THREE.Mesh>(null);
useFrame((state) => {
const t = state.clock.elapsedTime;
if (coreRef.current) coreRef.current.rotation.y = t * 0.18;
if (ringRef.current) {
ringRef.current.rotation.x = Math.PI / 2.4;
ringRef.current.rotation.z = t * 0.12;
}
});
return (
<Float speed={1.2} rotationIntensity={0.15} floatIntensity={0.35}>
<group>
<mesh ref={coreRef}>
<icosahedronGeometry args={[1.05, 2]} />
<meshPhysicalMaterial
color="#2563EB"
emissive="#1D4ED8"
emissiveIntensity={0.15}
roughness={0.12}
metalness={0.65}
transmission={0.55}
thickness={0.8}
transparent
opacity={0.92}
/>
</mesh>
<mesh ref={ringRef}>
<torusGeometry args={[1.55, 0.03, 16, 80]} />
<meshPhysicalMaterial
color="#7C3AED"
roughness={0.2}
metalness={0.5}
transmission={0.4}
transparent
opacity={0.7}
/>
</mesh>
</group>
</Float>
);
}
function NeuralParticles() {
const ref = useRef<THREE.Points>(null);
const positions = useMemo(() => {
const count = 48;
const pts = new Float32Array(count * 3);
for (let i = 0; i < count; i += 1) {
const radius = 1.8 + Math.random() * 1.4;
const theta = Math.random() * Math.PI * 2;
const phi = Math.acos(2 * Math.random() - 1);
pts[i * 3] = radius * Math.sin(phi) * Math.cos(theta);
pts[i * 3 + 1] = radius * Math.sin(phi) * Math.sin(theta);
pts[i * 3 + 2] = radius * Math.cos(phi);
}
return pts;
}, []);
useFrame((state) => {
if (!ref.current) return;
ref.current.rotation.y = state.clock.elapsedTime * 0.04;
ref.current.rotation.x = Math.sin(state.clock.elapsedTime * 0.2) * 0.08;
});
return (
<points ref={ref}>
<bufferGeometry>
<bufferAttribute attach="attributes-position" args={[positions, 3]} />
</bufferGeometry>
<pointsMaterial
size={0.035}
color="#60A5FA"
transparent
opacity={0.65}
sizeAttenuation
depthWrite={false}
/>
</points>
);
}
function WaveformRing() {
const lineRef = useRef<THREE.LineLoop>(null);
const positions = useMemo(() => {
const segments = 64;
const arr = new Float32Array((segments + 1) * 3);
for (let i = 0; i <= segments; i += 1) {
const angle = (i / segments) * Math.PI * 2;
arr[i * 3] = Math.cos(angle) * 2.1;
arr[i * 3 + 1] = Math.sin(angle) * 2.1;
arr[i * 3 + 2] = 0;
}
return arr;
}, []);
useFrame((state) => {
if (!lineRef.current) return;
const pos = lineRef.current.geometry.attributes.position;
const t = state.clock.elapsedTime;
for (let i = 0; i < pos.count; i += 1) {
const angle = (i / pos.count) * Math.PI * 2;
const wave = Math.sin(angle * 8 + t * 2.2) * 0.08;
const r = 2.1 + wave;
pos.setXYZ(i, Math.cos(angle) * r, Math.sin(angle) * r, Math.sin(angle * 4 + t) * 0.06);
}
pos.needsUpdate = true;
lineRef.current.rotation.z = t * 0.05;
});
return (
<lineLoop ref={lineRef}>
<bufferGeometry>
<bufferAttribute attach="attributes-position" args={[positions, 3]} />
</bufferGeometry>
<lineBasicMaterial color="#7C3AED" transparent opacity={0.45} />
</lineLoop>
);
}
function Scene() {
usePointerParallax(0.4);
return (
<>
<ambientLight intensity={0.55} />
<directionalLight position={[4, 4, 6]} intensity={0.9} color="#ffffff" />
<directionalLight position={[-3, -2, 2]} intensity={0.35} color="#7C3AED" />
<IntelligenceCore />
<NeuralParticles />
<WaveformRing />
</>
);
}
export function AudioIntelligenceScene() {
return (
<Canvas
camera={{ position: [0, 0, 5.2], fov: 42 }}
dpr={[1, 1.5]}
gl={{ antialias: true, alpha: true }}
style={{ background: 'transparent' }}
>
<Scene />
</Canvas>
);
}