CubeWave
threecn/cube-waveFreeComponent
A grid of instanced cubes riding a radial wave, blending --accent troughs into --primary crests.
Install it
npx shadcn@latest add https://threecn.dev/r/cube-wave.jsonSource
1"use client"23import * as React from "react"4import { useFrame } from "@react-three/fiber"5import * as THREE from "three"67import {8 SceneContainer,9 type SceneContainerProps,10} from "@/components/threecn/scene-container"11import {12 useShadcnTheme,13 type ThemeMode,14} from "@/components/hooks/use-shadcn-theme"1516function Cubes({17 grid,18 gap,19 speed,20 theme,21}: {22 grid: number23 gap: number24 speed: number25 theme: ThemeMode26}) {27 const { primaryColor, accentColor } = useShadcnTheme(theme)28 const meshRef = React.useRef<THREE.InstancedMesh>(null)29 const dummy = React.useMemo(() => new THREE.Object3D(), [])30 const tmpColor = React.useMemo(() => new THREE.Color(), [])31 const count = grid * grid3233 useFrame(({ clock }) => {34 const mesh = meshRef.current35 if (!mesh) return36 const t = clock.getElapsedTime() * speed37 const half = (grid - 1) / 238 let i = 039 for (let x = 0; x < grid; x++) {40 for (let z = 0; z < grid; z++) {41 const dx = x - half42 const dz = z - half43 const d = Math.sqrt(dx * dx + dz * dz)44 const y = Math.sin(d * 0.9 - t * 2.1) * 0.4545 dummy.position.set(dx * gap, y, dz * gap)46 dummy.updateMatrix()47 mesh.setMatrixAt(i, dummy.matrix)48 // Crest → --primary, trough → --accent.49 const k = (y + 0.45) / 0.950 tmpColor.copy(accentColor).lerp(primaryColor, k)51 mesh.setColorAt(i, tmpColor)52 i++53 }54 }55 mesh.instanceMatrix.needsUpdate = true56 if (mesh.instanceColor) mesh.instanceColor.needsUpdate = true57 })5859 return (60 <instancedMesh key={count} ref={meshRef} args={[undefined, undefined, count]}>61 <boxGeometry args={[0.62, 0.62, 0.62]} />62 <meshStandardMaterial roughness={0.3} metalness={0.35} />63 </instancedMesh>64 )65}6667export type CubeWaveProps = {68 /** Cubes per side (total = grid²). */69 grid?: number70 /** Spacing between cube centers. */71 gap?: number72 /** Wave speed multiplier. */73 speed?: number74 className?: string75 theme?: ThemeMode76 environment?: SceneContainerProps["environment"]77}7879/**80 * A grid of instanced cubes riding a radial wave from the center outward.81 * Each cube blends from `--accent` in the troughs to `--primary` on the82 * crests. One draw call, hundreds of cubes.83 */84export function CubeWave({85 grid = 16,86 gap = 0.75,87 speed = 1,88 className,89 theme = "auto",90 environment = "studio",91}: CubeWaveProps) {92 return (93 <SceneContainer94 className={className}95// … truncated
What it pulls in
npm packages
Files it writes
More from threecn
All 28 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| AuroraRibbonsaurora-ribbons | threecn | Components | Free | 3 deps · 3 files | |
| Boidsboids | threecn | Components | Free | 3 deps · 3 files | |
| Clothcloth | threecn | Components | Free | 3 deps · 3 files | |
| Crystalcrystal | threecn | Components | Free | 3 deps · 3 files | |
| CurlFlowcurl-flow | threecn | Components | Free | 3 deps · 3 files | |
| DnaHelixdna-helix | threecn | Components | Free | 3 deps · 3 files | |
| FloatingCard3Dfloating-card-3d | threecn | Components | Free | 3 deps · 3 files | |
| Globeglobe | threecn | Components | Free | 3 deps · 3 files |
