feat: real FreeCAD BMU v2 3D model + Orbitron font + ER nucleus logo

PCB 3D Models:
- bmu-v2-full.glb (1.6MB) — complete BMU v2 from FreeCAD with all components
- bmu-switch-mosfet.glb (369KB) — switch MOSFET daughter board
- Source: KXKM_Batterie_Parallelator branch object-orriented
- Converted via cascadio/trimesh from STEP

Fonts:
- Orbitron Bold (17KB) — geometric futuristic font for 3D text
- Space Mono Bold (80KB) — tech monospace
- Applied to all WebGL text (section labels, silkscreen, countdown)

Countdown (AtomGlitch):
- 3x "ER" logo at nucleus center, each on different rotation axis
- Cyan, amber, green glow variants
- Orbitron font for all orbital text

WebGL Background:
- RealPCB now uses bmu-v2-full.glb (real FreeCAD model)
- SwitchBoard added as secondary board
- Orbitron font for section labels

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Clément SAILLANT
2026-03-30 08:31:52 +00:00
parent 4f9f464dab
commit 1f960a1bb1
7 changed files with 75 additions and 7 deletions
Binary file not shown.
+11
View File
@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html lang=en>
<meta charset=utf-8>
<meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
<title>Error 404 (Not Found)!!1</title>
<style>
*{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:54px;width:150px}
</style>
<a href=//www.google.com/><span id=logo aria-label=Google></span></a>
<p><b>404.</b> <ins>Thats an error.</ins>
<p>The requested URL <code>/s/ajdhani/v17/LDI2apCSOBg7S-QT7pa8FsOs.ttf</code> was not found on this server. <ins>Thats all we know.</ins>
Binary file not shown.
Binary file not shown.
Binary file not shown.
+41 -1
View File
@@ -171,6 +171,26 @@ function Nucleus() {
}
});
// Logo refs — 3 copies at different rotations
const logo1Ref = useRef<THREE.Group>(null);
const logo2Ref = useRef<THREE.Group>(null);
const logo3Ref = useRef<THREE.Group>(null);
useFrame(({ clock, camera }) => {
const t = clock.getElapsedTime();
// Each logo copy rotates on a different axis
if (logo1Ref.current) {
logo1Ref.current.rotation.y = t * 0.8;
logo1Ref.current.quaternion.copy(camera.quaternion);
}
if (logo2Ref.current) {
logo2Ref.current.rotation.set(t * 0.5, t * 0.3, 0);
}
if (logo3Ref.current) {
logo3Ref.current.rotation.set(0, t * -0.4, t * 0.6);
}
});
return (
<group>
{/* outer energy shell */}
@@ -188,6 +208,26 @@ function Nucleus() {
<sphereGeometry args={[0.32, 32, 32]} />
<meshStandardMaterial color="#ffffff" emissive={COLORS.amber} emissiveIntensity={2} metalness={0.6} roughness={0.2} />
</mesh>
{/* ER logo — 3 copies at center, different rotations */}
<group ref={logo1Ref}>
<Text fontSize={0.25} font={FONT_URL} anchorX="center" anchorY="middle" letterSpacing={0.05}>
ER
<meshStandardMaterial color="#ffffff" emissive="#5bd1d8" emissiveIntensity={1.5} transparent opacity={0.7} />
</Text>
</group>
<group ref={logo2Ref}>
<Text fontSize={0.2} font={FONT_URL} anchorX="center" anchorY="middle" letterSpacing={0.05}>
ER
<meshStandardMaterial color="#ffffff" emissive="#f1c27a" emissiveIntensity={1} transparent opacity={0.35} />
</Text>
</group>
<group ref={logo3Ref}>
<Text fontSize={0.18} font={FONT_URL} anchorX="center" anchorY="middle" letterSpacing={0.05}>
ER
<meshStandardMaterial color="#ffffff" emissive="#b6d18f" emissiveIntensity={0.8} transparent opacity={0.25} />
</Text>
</group>
</group>
);
}
@@ -233,7 +273,7 @@ function EnergyArc({ color }: { color: THREE.Color }) {
/* ---------- 3D Circular / Orbital text ---------- */
const LAUNCH = new Date('2026-05-01T00:00:00+02:00').getTime();
const FONT_URL = '/assets/fonts/manrope-regular.ttf';
const FONT_URL = '/assets/fonts/orbitron-bold.ttf';
function pad(n: number) { return String(n).padStart(2, '0'); }
+23 -6
View File
@@ -22,24 +22,39 @@ const COLORS = {
silkscreen: new THREE.Color('#e8e8d0'),
};
const FONT_URL = '/assets/fonts/manrope-regular.ttf';
const FONT_URL = '/assets/fonts/orbitron-bold.ttf';
/* ---------- Scroll state ---------- */
let scrollProgress = 0;
/* ---------- Real PCB Board ---------- */
/* ---------- Real PCB Board (full 3D with components from FreeCAD) ---------- */
function RealPCB() {
let glb: any = null;
try { glb = useGLTF('/assets/models3d/pcb-bmu-v2.glb'); } catch {}
try { glb = useGLTF('/assets/models3d/bmu-v2-full.glb'); } catch {}
if (!glb?.scene) return null;
return (
<primitive
object={glb.scene.clone()}
scale={40}
scale={8}
rotation={[-Math.PI / 2, 0, 0]}
position={[0, 0, 0]}
position={[0, 0.1, 0]}
/>
);
}
/* ---------- Switch MOSFET board ---------- */
function SwitchBoard() {
let glb: any = null;
try { glb = useGLTF('/assets/models3d/bmu-switch-mosfet.glb'); } catch {}
if (!glb?.scene) return null;
return (
<primitive
object={glb.scene.clone()}
scale={8}
rotation={[-Math.PI / 2, 0, 0]}
position={[8, 0.1, 3]}
/>
);
}
@@ -377,6 +392,7 @@ function PCBScene() {
<group>
<Suspense fallback={null}>
<RealPCB />
<SwitchBoard />
<ComponentCluster />
</Suspense>
<CurrentFlow />
@@ -440,7 +456,8 @@ export default function WebGLBackground() {
}
/* Preload all models */
useGLTF.preload('/assets/models3d/pcb-bmu-v2.glb');
useGLTF.preload('/assets/models3d/bmu-v2-full.glb');
useGLTF.preload('/assets/models3d/bmu-switch-mosfet.glb');
useGLTF.preload('/assets/models3d/resistor_0603.glb');
useGLTF.preload('/assets/models3d/capacitor_0805.glb');
useGLTF.preload('/assets/models3d/inductor_0805.glb');