A polished marble sculpture under studio lighting. The pointer orbits a single bright key light around the bust in real 3D, raking it across the stone face for hot specular highlights, cool subsurface shadows in the recesses, and a warm rim that tracks the cursor like a real museum spotlight.
import SculptedLightBust from '@crazygl/hero-sculpted-light-bust';
export default function Hero() {
return (
<SculptedLightBust
heading="Carved in light."
productModel="/models/bust.glb"
materialPreset="marble"
/>
);
}Drop any GLB/GLTF mesh on productModel; the hero auto-fits it to a normalised bounding box. Single-subject hero scans (a bust, head, or statue) read best.
productModel, modelScale, positionX/Y, yaw, pitch, parallaxStrength.lightRadius, lightIntensity, keyColor, rimWarmth, rimIntensity, fillIntensity (studio fill).materialPreset (marble / porcelain / gold / chrome / bronze / obsidian / jade), marbleWhiteness, marbleRoughness, subsurfaceStrength, subsurfaceColor.backgroundTop / backgroundBottom gradient, backgroundDarkness, floorHaloIntensity, transparent.npm install @crazygl/hero-sculpted-light-bustThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import SculptedLightBust from '@crazygl/hero-sculpted-light-bust';
export default function Landing() {
return (
<SculptedLightBust />
);
}The wrapper renders static HTML on the server and only initialises the canvas after hydration, so search engines see your copy.
// app/page.tsx — works in SSR-first frameworks (Next, Remix, Astro, etc.)
'use client';
import SculptedLightBust from '@crazygl/hero-sculpted-light-bust';
export default function Page() {
return (
<section>
<SculptedLightBust
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}