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:
Binary file not shown.
@@ -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>That’s an error.</ins>
|
||||
<p>The requested URL <code>/s/ajdhani/v17/LDI2apCSOBg7S-QT7pa8FsOs.ttf</code> was not found on this server. <ins>That’s all we know.</ins>
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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'); }
|
||||
|
||||
|
||||
@@ -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');
|
||||
|
||||
Reference in New Issue
Block a user