3D Product Showcase / Object Theater
Photorealistic 3D renders, orbital rotation, studio lighting, scroll-driven camera movements, exploded views.
Visual DNA
Products as sculptural objects in a virtual studio. Real-time 3D rendering replaces photography. Users orbit, zoom, interact with photorealistic models. Studio lighting with soft key light, subtle fill, controlled rim light.
Design Principles
PRODUCT AS SCULPTURE
The 3D model is art-directed like a photography shoot — not a technical demo. Studio lighting, camera angles, background composition, material finishes. The product is the hero, the studio is the stage, the user is the director. Every aspect of the 3D scene is designed, not defaulted. The model isn't just "displayed" — it's presented, lit, and choreographed like a museum piece.
What it prevents: Technical 3D demos that show the model with default lighting and no art direction. The product should look like it was photographed by a professional, not rendered by an engineer.
---
INTERACTION IS EXPLORATION
The user doesn't just see the product — they explore it. Scroll-driven camera movements (dolly, pan, tilt), orbital rotation, zoom, exploded views. Every interaction reveals something new about the product. The scroll wheel is the camera crane; the mouse is the orbit control. The user is the cinematographer.
What it prevents: Static 3D viewers where the model sits in place and the user can only rotate it. The interaction should be cinematic — scroll-driven, choreographed, revealing.
---
STUDIO LIGHTING
Three-point lighting setup: soft key light (main illumination), subtle fill light (shadow detail), controlled rim light (edge definition). The lighting is warm and neutral — not colored, not dramatic. The goal is to show the product's materials and finishes accurately, not to create a mood. The studio is invisible; the product is luminous.
What it prevents: Default 3D lighting that's flat, harsh, or colored. The lighting should feel like a professional product photography studio — controlled, flattering, invisible.
---
MINIMAL UI AROUND PRODUCT
The UI is invisible. No toolbars, no control panels, no information overlays cluttering the viewport. The product fills the screen. Specs and details appear in side panels or below — not overlaid on the 3D scene. The interface should feel like a museum display case — the product is inside, the labels are outside.
What it prevents: 3D viewers with visible controls, rotation widgets, and information overlays. The UI should disappear; the product should be the only thing the user sees.
---
NEUTRAL BACKGROUND, PRODUCT COLOR
The background is neutral — light gray to dark, gradient or solid. The product provides all color. This is the same principle as studio photography: the background is a seamless paper roll; the product is the subject. The background should never compete with the product for attention.
What it prevents: Busy backgrounds, environmental scenes, or colored backgrounds that distract from the product. The background is the stage; the product is the performer.
Typography System
# Typography System ## Display Typeface | Property | Specification | |----------|--------------| | **Register** | Minimal, functional — doesn't compete with the 3D product | | **Examples** | Inter, Geist, Söhne, Aktiv Grotesk, Satoshi | | **Weight** | 400-600 (medium — not bold, the product is the hero) | | **Tracking** | 0.02em-0.04em (standard) | | **Size** | `clamp(2rem, 5vw, 4rem)` — large product name, small relative to the model | | **Transform** | Sentence case for product name, UPPERCASE for labels | **Why minimal sans:** The 3D product is the visual hero. The typography should be invisible — neutral, clean, functional. If the type has personality, it competes with the product. Inter and Geist are designed to be unseen. --- ## Body / Specs Typeface | Property | Specification | |----------|--------------| | **Register** | Monospace or clean sans — technical, precise | | **Examples** | JetBrains Mono, Space Mono, Inter, Geist Mono | | **Weight** | 400-500 | | **Tracking** | 0.01em-0.02em (standard) | | **Size** | `clamp(0.875rem, 1vw, 1rem)` — 14-16px for specs | | **Line Height** | 1.5-1.6 | **Why mono for specs:** Product specifications are technical data — dimensions, materials, weights. Monospace presents this data like a technical readout, which matches the precision of the 3D rendering. The mono type says "this is data, not marketing." --- ## Micro / Label Type | Property | Specification | |----------|--------------| | **Register** | Same family as body, wide tracking | | **Examples** | Inter, Geist | | **Weight** | 400-500 | | **Tracking** | 0.15em-0.25em (very wide, technical) | | **Size** | 10-12px | | **Transform** | UPPERCASE | **Usage:** Section labels, spec categories, navigation. These tiny labels feel like technical annotations — "MATERIALS", "DIMENSIONS", "FINISH", "WEIGHT". --- ## Type Scale ``` Display (product name): clamp(2rem, 5vw, 4rem) — large but smaller than the model Body (specs): clamp(0.875rem, 1vw, 1rem) — 14-16px, mono or sans Micro (labels): 10-12px — technical annotations ``` The scale is compact — 10px to 64px. The contrast is between the large product name and the precise spec data, not between extreme type sizes. The product model is always larger than any text. --- ## Font Pairing Logic **Sans display + mono specs:** Inter (product name) + JetBrains Mono (specifications). The sans carries the brand voice (clean, modern); the mono carries the technical data (precise, measured). This pairing mirrors the relationship between marketing and engineering. **Alternative:** Single sans family throughout — Inter for everything. Simpler, but loses the technical readout quality of mono specs. **Never:** Serif typefaces (wrong register — this is technical, not editorial), decorative fonts (competes with product), or multiple display fonts (the product is the only display element).
Color Architecture
# Color Architecture ## Ground ```css --color-ground-light: #F5F5F5; /* Light gray — studio seamless paper */ --color-ground-mid: #E0E0E0; /* Medium gray — gradient midpoint */ --color-ground-dark: #1A1A1A; /* Dark — for dramatic product shots */ --color-ground-gradient: radial-gradient( ellipse at center, #F5F5F5 0%, #E0E0E0 70%, #C0C0C0 100% ); ``` **Why neutral gray:** The background is a studio seamless paper roll. Light gray (#F5F5F5) is the standard product photography background — it's neutral, doesn't compete with the product, and provides a clean surface for shadows. The gradient creates a subtle vignette that focuses attention on the center. --- ## Text ```css --color-text-on-light: #1A1A1A; /* Near-black on light gray */ --color-text-on-dark: #F5F5F5; /* Light gray on dark */ --color-text-muted: #888888; /* Medium gray for labels and specs */ --color-text-accent: #0066FF; /* Electric blue for interactive elements */ ``` **On light backgrounds:** Near-black text (#1A1A1A), not pure black. Pure black on light gray is too harsh — near-black has a slightly softer contrast that feels more like print. --- ## Accent ```css --color-accent: #0066FF; /* Electric blue — interactive highlight */ --color-accent-hover: #0052CC; /* Darker blue on hover */ ``` **Usage:** The accent appears on interactive elements — "ROTATE" buttons, "EXPLODE VIEW" toggles, scroll indicators. It should be used sparingly — the product provides all the color; the accent is for UI affordances only. **Why electric blue:** It's the color of technical interfaces — CAD programs, 3D modeling software, engineering tools. The blue signals "this is a technical, interactive experience." --- ## Product Color The product provides all color. The 3D model's materials and finishes are the color palette: | Material | Color Treatment | |----------|----------------| | **Anodized aluminum** | Silver/gray with specular highlights | | **Plastic** | Matte, solid color (product's actual color) | | **Glass** | Transparent with refraction and environment reflections | | **Fabric** | Diffuse, textured, product's actual color | | **Leather** | Semi-gloss, warm tones, texture detail | **The product's color is the design's color.** The background is neutral; the UI is minimal; the product is the only source of visual richness. --- ## Studio Lighting Color ```css --light-key: #FFFFFF; /* Key light — pure white, main illumination */ --light-fill: #F0F0F0; /* Fill light — slightly warm, shadow detail */ --light-rim: #E8E8E8; /* Rim light — edge definition */ --light-ambient: #404040; /* Ambient — base illumination */ ``` **Why white lighting:** Studio lighting is neutral white — not colored, not warm, not cool. The goal is to show the product's true colors, not to create a mood. Colored lighting would distort the product's materials. --- ## Color Don'ts | Don't | Do Instead | |------|------------| | Colored backgrounds | Neutral gray (#F5F5F5 to #1A1A1A) | | Multiple accent colors | One electric blue (#0066FF) for UI only | | Colored studio lighting | Neutral white lighting — show true product colors | | Busy environmental backgrounds | Studio seamless — gradient or solid neutral | | Gradient overlays on product | Clean 3D rendering with proper lighting | | Pure black text on light | Near-black #1A1A1A | | Color that competes with product | Product provides all color; UI is neutral |
Motion Principles
# Motion Principles
## Philosophy
Motion in 3D Product Showcase is **smooth and camera-driven**. The user controls the camera — scroll drives dolly, pan, and tilt movements. Orbital rotation lets the user inspect the product from any angle. Exploded views reveal internal components. All motion is smooth, weighted, and cinematic — like a professional product video where the user is the director.
---
## Scroll-Driven Camera
| Scroll Range | Camera Movement | Purpose |
|-------------|-----------------|---------|
| 0-25% | Dolly in (camera moves toward product) | Close-up of product details |
| 25-50% | Orbital pan (camera circles 90°) | Side profile view |
| 50-75% | Tilt up (camera moves from below to above) | Top-down view |
| 75-100% | Pull back (camera retreats to full product) | Full product in context |
```javascript
// Scroll-driven camera (React Three Fiber)
useFrame(() => {
const scrollProgress = scroll.offset;
camera.position.x = Math.sin(scrollProgress * Math.PI * 2) * 5;
camera.position.z = Math.cos(scrollProgress * Math.PI * 2) * 5;
camera.position.y = scrollProgress * 3;
camera.lookAt(0, 0, 0);
});
```
**The scroll should feel like a camera movement**, not a page scroll. The product stays centered; the camera orbits, dollies, and tilts around it. The easing should be smooth — `cubic-bezier(0.22, 1, 0.36, 1)` — with no sudden jumps.
---
## Orbital Rotation (User Control)
| Property | Specification |
|----------|--------------|
| **Control** | Mouse drag or touch |
| **Rotation** | 360° horizontal, ±60° vertical |
| **Damping** | 0.1 (smooth follow, slight lag) |
| **Auto-rotate** | Optional, 0.5 RPM when idle |
| **Zoom** | Scroll wheel, clamp(2, 10) distance |
**The orbital control should feel weighted.** Damping at 0.1 creates a slight lag — the camera follows the mouse, not snaps to it. This creates a cinematic quality, like a camera on a motorized rig.
---
## Exploded View Animation
```javascript
// Exploded view (scroll-driven or toggle)
const explodeProgress = useScrollOffset(0.6, 0.8); // Triggered at 60-80% scroll
components.forEach((comp, i) => {
comp.position.x = comp.originalPos.x + comp.explodeDir.x * explodeProgress * 2;
comp.position.y = comp.originalPos.y + comp.explodeDir.y * explodeProgress * 2;
comp.position.z = comp.originalPos.z + comp.explodeDir.z * explodeProgress * 2;
});
```
**Purpose:** Exploded views reveal the product's internal components — each part separates along its assembly axis. The animation should be smooth (1000ms+) and triggered by scroll position or a toggle button. The explosion should feel like a technical diagram coming to life.
---
## Material / Finish Transitions
| Trigger | Animation | Duration |
|---------|-----------|----------|
| Color swatch click | Material color crossfade | 600ms |
| Finish toggle (matte ↔ gloss) | Roughness/metalness lerp | 800ms |
| Environment change | Environment map crossfade | 1000ms |
```javascript
// Material transition (lerp)
useFrame(() => {
material.color.lerp(targetColor, 0.1);
material.roughness += (targetRoughness - material.roughness) * 0.1;
material.metalness += (targetMetalness - material.metalness) * 0.1;
});
```
**Purpose:** When the user selects a different color or finish, the material properties smoothly transition — not an instant swap. The lerp creates a morphing effect that feels like the product is physically changing material.
---
## Entrance Animations
| Element | Animation | Duration | Easing | Delay |
|---------|-----------|----------|--------|-------|
| 3D canvas | Opacity 0→1 | 1500ms | `ease-out` | 0ms |
| Product model | Scale 0.9→1 + opacity 0→1 | 2000ms | `cubic-bezier(0.22, 1, 0.36, 1)` | 500ms |
| Product name | Opacity 0→1 + translateY(16px)→0 | 800ms | `ease-out` | 1000ms |
| Spec panel | Opacity 0→1 + translateX(20px)→0 | 600ms | `ease-out` | 1200ms |
| Scroll indicator | Opacity 0→1 | 1000ms | `ease-out` | 2000ms |
**Key:** The 3D model entrance is SLOW (2000ms). The product should feel like it's materializing, not appearing. The scale-up from 0.9 to 1.0 creates a subtle "growing into place" effect.
---
## Interaction States
| Element | Hover State | Active State |
|---------|------------|-------------|
| Color swatches | Scale 1.0 → 1.1 (200ms) | Selected: ring border |
| Toggle buttons | Background fill (300ms) | Active: filled bg |
| Scroll indicator | Bounce animation (600ms) | — |
| Hotspots | Pulse animation (1000ms) | Click: camera move to detail |
---
## Reduced Motion
When `prefers-reduced-motion: reduce`:
- Scroll-driven camera: disabled (static front view)
- Orbital damping: instant (no lag)
- Auto-rotate: disabled
- Exploded view: instant (fully exploded or collapsed)
- Material transitions: instant swap
- Entrance animations: instant opacity
```css
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}
```
---
## What NOT to Animate
| Never | Why |
|-------|-----|
| Fast, snappy camera cuts | Breaks the cinematic quality — camera moves should be smooth |
| Bounce or spring on the model | The product is a physical object, not a toy |
| Auto-rotating without user control | The user should be the director |
| Particle effects | Too digital — this is a product showcase, not a game |
| Text typing animations | Too gimmicky for a technical product display |
| Screen shake or impact effects | Wrong register — this is precision, not action |Layout Grammar
# Layout Grammar ## Grid System **No visible grid.** The 3D product fills the viewport; UI elements float at the edges. Internally: - 3D canvas: full viewport, `position: fixed`, `z-index: 0` - UI overlay: `position: relative`, `z-index: 10` - Product centered: the model sits at viewport center, always - Specs: side panel (right) or below (scroll-triggered) --- ## Hero Section | Property | Specification | |----------|--------------| | Height | Full viewport — `min-h-[100dvh]` | | Background | 3D canvas with neutral studio ground | | Product | Centered, full-viewport, photorealistic 3D model | | UI | Minimal — product name (top-left), scroll indicator (bottom-center) | ``` ┌─────────────────────────────────────────┐ │ PRODUCT NAME [SPECS] │ │ │ │ │ │ [3D PRODUCT MODEL] │ │ [Centered, full-viewport] │ │ [Orbital rotation enabled] │ │ │ │ │ │ [SCROLL TO EXPLORE] │ │ ↓ │ └─────────────────────────────────────────┘ ``` **The product is the layout.** Everything else is minimal UI that floats at the edges. The 3D canvas is fixed; the UI scrolls over it. --- ## Scroll Sequence Layout ``` ┌─────────────────────────────────────────┐ │ [3D canvas — fixed, full viewport] │ │ [Product model — camera moves] │ │ │ │ ┌─────────┐ ┌────────────────────┐ │ │ │ Section │ │ Spec panel │ │ │ │ label │ │ (slides in from │ │ │ │ │ │ right on scroll) │ │ │ └─────────┘ └────────────────────┘ │ │ │ │ [Scroll drives camera: dolly, orbit, │ │ tilt, exploded view] │ └─────────────────────────────────────────┘ ``` The 3D canvas stays fixed. As the user scrolls, the camera moves around the product. Spec panels slide in from the right at specific scroll positions, providing details about the part of the product currently in view. --- ## Section Spacing ```css --section-height: 100vh; /* Each scroll section is one viewport */ --spec-panel-width: clamp(280px, 30vw, 400px); --spec-panel-margin: clamp(1.5rem, 4vw, 4rem); --ui-edge-margin: clamp(1.5rem, 4vw, 4rem); ``` **Each scroll section is one viewport height.** The user scrolls through 4-6 viewports of scroll space, and the camera moves through a corresponding sequence of angles and views. --- ## Layout Patterns ### Pattern 1: Full-Viewport Product + Floating UI ``` ┌─────────────────────────────────────────┐ │ [Product name] [Specs] │ │ │ │ [3D Product Model] │ │ │ │ [Scroll indicator] │ └─────────────────────────────────────────┘ ``` ### Pattern 2: Product + Side Spec Panel ``` ┌─────────────────────────────┬───────────┐ │ │ │ │ [3D Product Model] │ SPECS │ │ (camera at angle) │ Material │ │ │ Weight │ │ │ Size │ │ │ [Color] │ │ │ │ └─────────────────────────────┴───────────┘ ``` ### Pattern 3: Exploded View + Component Labels ``` ┌─────────────────────────────────────────┐ │ [Exploded 3D product] │ │ [Components separated] │ │ │ │ → Component A (label) │ │ → Component B (label) │ │ → Component C (label) │ └─────────────────────────────────────────┘ ``` --- ## Responsive Behavior | Breakpoint | Layout Change | |------------|--------------| | **Desktop (1200px+)** | Full 3D canvas, side spec panel, orbital controls, scroll-driven camera | | **Tablet (768px)** | Full 3D canvas, spec panel below (toggle), simplified camera sequence | | **Mobile (375px)** | Full 3D canvas, specs as bottom sheet, touch orbital controls, reduced camera sequence | **On mobile:** The 3D product should still fill the viewport. Touch controls replace mouse drag for orbital rotation. The spec panel becomes a bottom sheet that slides up when tapped. The scroll-driven camera sequence is simplified — fewer angles, shorter scroll depth. --- ## Layout Don'ts | Don't | Do Instead | |------|------------| | Visible 3D controls (rotation widgets) | Invisible controls — mouse drag or touch | | Information overlays on the 3D scene | Side panels or below-section specs | | Busy backgrounds or environmental scenes | Neutral studio ground (gradient or solid) | | Multiple products in view | One product, centered, full-viewport | | Text over the 3D model | Text at the edges — product is the hero | | Standard page layout (header, content, footer) | 3D canvas fixed, UI floats over it | | Card grids for features | Scroll-driven camera reveals features |
Texture & Surface
# Texture & Material
## Primary Texture: Photorealistic PBR Material Language
The texture IS the material. Every surface should read as a physical substance under studio lighting — the product must look like it could be picked up, weighed, and photographed:
| Quality | Description |
|---------|-------------|
| **Metal** | Sharp, high-contrast reflections; crisp environmental highlights that slide as the camera orbits |
| **Glass** | Transmission, refraction, and caustics; the environment map distorts through the body |
| **Plastic** | Soft specular highlight, low-contrast reflection — matte sheen rather than mirror |
| **Rubber / matte** | Purely diffuse; no specular peak; light falls off softly across the surface |
| **Ceramic** | Glossy but not mirror-like — a single clean, slightly blurred highlight |
**The goal:** Materials are the story. A metal body reflects the studio; a matte surface absorbs it. Users should be able to read the material at a glance, the way they would from a product photograph.
---
## Studio Backdrop
```css
.studio-backdrop {
background: linear-gradient(
160deg,
#F5F4F2 0%,
#E4E2DE 55%,
#D6D3CE 100%
);
background-size: 100% 100%;
}
.studio-backdrop--dark {
background: radial-gradient(
ellipse at 50% 35%,
#2A2A2A 0%,
#1A1A1A 65%,
#111111 100%
);
}
```
**Purpose:** The product lives in a virtual photo studio — a seamless gradient sweep from light gray to dark. Neutral backgrounds (light gray to dark) let the product's own colors carry the accent. The backdrop is never busy; it exists to catch reflections on the product's surfaces.
---
## Shadow Softness
```css
.soft-shadow {
box-shadow:
0 24px 60px -20px rgba(20, 20, 20, 0.35),
0 8px 24px -8px rgba(20, 20, 20, 0.18);
}
.product-ground-plane {
background: radial-gradient(
ellipse at 50% 50%,
rgba(0, 0, 0, 0.28) 0%,
rgba(0, 0, 0, 0.10) 45%,
transparent 75%
);
filter: blur(6px);
}
```
**Purpose:** Soft shadows ground the product in space. In the 3D scene, shadow softness comes from a large, soft key light with `shadow.radius` and `shadow.bias` tuned so contact shadows fall off gently. A blurred gradient plane under the product sells "it sits here" without harsh occlusion.
---
## Image Processing / Post-Processing
The render pipeline is part of the texture — the final image is graded like a photograph:
| Processing | Effect | Parameters |
|-----------|--------|------------|
| **Tone mapping** | Filmic response, rolled-off highlights | ACES Filmic curve |
| **Depth of field** | Subtle photographic focus | 0.1-0.3 blur radius, product in focus |
| **Vignette** | Soft edge falloff, showroom intimacy | Opacity 0.15-0.25 |
| **Grain** | Subtle filmic texture on glass/metal | Opacity 0.02-0.03 |
| **Exposure** | Controlled studio exposure, no blown highlights | 1.0-1.2 |
**The goal:** The rendered frame should look like a photograph taken in a studio — not a raw engine output. Tone mapping and depth of field are subtle (texture axis 5, but restraint keeps it premium).
---
## Surface Rules
| Surface | Treatment |
|---------|-----------|
| Background | Neutral studio gradient (light gray to dark), never busy |
| Product | PBR materials with environment-map reflections |
| Ground | Soft blurred shadow plane under the product |
| Text overlays | Minimal — product name large, specs in mono, small details |
| UI elements | Translucent, floating panels; glass-like, low opacity |
| Dividers | None — scroll sequences change camera angle instead |
**The product is the hero; every other surface exists to serve it.** The backdrop catches light for reflections, the ground catches shadow, and the UI stays out of the way.
---
## Texture Don'ts
| Don't | Do Instead |
|------|------------|
| Default grey placeholder materials | Art-directed PBR materials with env-map reflections |
| Flat 2D product photos as primary | Live 3D model in a studio scene |
| Busy, patterned backgrounds | Neutral studio gradient that catches reflection |
| Harsh, unshadowed lighting | Soft key, subtle fill, controlled rim |
| Sharp contact shadows | Soft shadows with gradual falloff |
| Chrome-everything (mirror metal abuse) | Metal only where the product would use metal |
| Text-heavy overlays on the product | Minimal UI, translucent panels around it |
Vocabulary Bank
# Vocabulary Bank ## Primary Terms | Term | Why It Matters | |------|---------------| | `PBR materials` | Physically based rendering — the material language (metal, glass, plastic) that makes surfaces believable | | `orbital rotation` | Camera orbiting the product — the core interaction, exploration via viewpoint | | `studio lighting` | Soft key, subtle fill, controlled rim — lighting is the aesthetic | | `exploded view` | Product parts separated in space — reveals construction and craft | | `scroll-driven camera` | Scroll controls dolly/pan/tilt — the product is revealed through the journey | --- ## Secondary Terms | Term | Effect | |------|--------| | `WebGL` | The rendering API powering real-time 3D in the browser | | `viewport` | The camera's visible frame — full-viewport scenes for maximum product presence | | `orbit controls` | Drag-to-rotate camera with inertia, damping, and zoom limits | | `environment map` | Pre-baked reflections that give metal and glass their believable sheen | | `depth of field` | Subtle photographic focus — product sharp, backdrop soft | | `tone mapping` | Filmic response that grades raw render output into a photographic frame | | `LOD` | Level of detail — reduced geometry at distance for performance | | `camera dolly / pan / tilt` | Camera moves that choreograph scroll-driven sequences | --- ## Context Terms | Term | Mood | |------|------| | `showroom` | Quiet, premium, everything serves the object | | `object theater` | The product is the sole performer on a neutral stage | | `product as sculpture` | The model is art-directed like a sculpture in a gallery | | `photorealistic` | Indistinguishable from studio photography | | `hero product` | The single object the page is built around | | `photography shoot` | Lighting, angle, and backdrop chosen like a camera setup | | `sculptural` | The product's form is the content | --- ## Banned Terms | Term | Why It Breaks the Style | |------|------------------------| | `flat product photos` | Live 3D replaces photography — static 2D images are the fallback, never the primary | | `2D imagery only` | The style is defined by real-time 3D rendering | | `busy backgrounds` | The neutral studio backdrop exists to catch reflections, not attention | | `text-heavy layouts` | Typography is minimal (axis 2) — large name, small specs | | `default 3D asset look` | Grey-box materials and placeholder lighting are the generic signature to kill | | `gimmicky rotation` | Rotation without purpose is a tech demo, not a showcase | | `unlit scene` | Lighting IS the aesthetic — an unlit scene is unfinished | | `product carousel` | Autoplay rotation replaces exploration with a slideshow | | `broken canvas` | No WebGL fallback — the hero must render for every user | --- ## Prompt-Ready Phrases ``` "real-time 3D product model (Three.js/React Three Fiber) with orbital controls" "studio lighting — soft key, subtle fill, controlled rim light" "PBR materials with environment-map reflections (metal, glass, matte plastic)" "scroll-driven camera — dolly, pan, tilt across scroll sequences" "exploded-view animation revealing internal construction" "neutral studio backdrop (light gray to dark) with soft shadow plane" "subtle depth of field and filmic tone mapping (ACES)" "minimal UI — large product name, specs in mono in side panels" "product-centered full-viewport layout — product as sculpture" "LOD and pixel-ratio caps for 60fps; static photorealistic fallback for low-end devices" "drag to explore with inertia and damping; reduced-motion users get a static hero" ```
Anti-Slop Checklist
When to Use
# When to Use ## Perfect For | Context | Why This Style Works | |---------|---------------------| | **Consumer electronics** | A photoreal 3D model shows off every curve and material detail better than a photo | | **Luxury goods** | The showroom/object-theater framing signals craftsmanship and exclusivity | | **Automotive** | Car configurators and launch sites are the genre's origin — scroll-driven camera tours build desire | | **Furniture & interiors** | Products must be "walked around"; orbit controls sell shape and material | | **Footwear** | Sneaker launches use 3D drops — rotation shows silhouette, texture, and colorways | | **Hardware / industrial startups** | A real-time model proves the product exists and is buildable | | **DTC product pages** | Replaces flat packshots with an interactive reason to stay and explore | ## Brand Personality Match This style reinforces brands that are: - **Sculptural** — the product is a designed object, a piece of art, not a widget - **Photorealistic** — engineering detail and true to the physical build - **Interactive** — users don't look, they explore (orbit, zoom, rotate) - **Premium** — showroom framing = the product is worth a room of its own - **Tactile** — the PBR surfaces make you want to touch them - **Restrained** — the interface stays quiet so the object speaks --- ## Avoid When | Context | Why It Fails | |---------|-------------| | **Content-heavy sites** | Docs, editorial, or blog-first pages need layout density — this style is product-first | | **Service / SaaS marketing** | Nothing physical to showcase; 3D would be decorative, and the motion axis would read as show-off | | **Data products / dashboards** | The minimal chrome and huge object hero don't fit data-density | | **Brands without a physical-buildable product** | Talking product with no hero product rings hollow | | **Budget / quick-turn projects** | A quality 3D stage + PBR + camera scripting is expensive to build and keep fast | | **Mass-market catalogs** | Hundreds of SKUs — one sculptural hero doesn't scale to a grid of SKU tiles | --- ## How to Decide Ask: **"Does my product deserve to be treated as sculpture — is there a physical object worth orbiting, and will the interface let users explore it?"** If yes → 3D Product Showcase / Object Theater. If no → Luxury Refined Restraint (if the product can whisper through whitespace and photography); Futuristic Fashion (if you want a white, minimal stage with a spotlight reveal instead of a full 3D scene); Dark Tech Terminal (if the product IS the tech — a dark mission-control frame around it). --- ## The 95% Confidence Trio | Sibling Style | Choose it instead when… | |---------------|--------------------------| | **Futuristic Fashion** | The hero is a *person or garment in motion*, lives in pure white, and wants a spotlight/checkerboard framing — not a full 3D scene | | **Dark Tech Terminal** | The product is a *system* (dashboard, terminal, OS) shown in a dark neon mission-control—not a physical object | | **Luxury Refined Restraint** | The product sells on *whitespace, whisper-quiet photography, and heritage* — no real-time 3D interaction needed |
Common Mistakes
Mistake 1: Heavy WebGL Performance
**What people do:** Load a dense, high-poly scene with 4K textures, heavy post-processing, and full-resolution rendering on every device.
**Why it fails:** A showcase that runs at 12fps destroys the premium, sculptural feel — the product stutters, the camera fights the user, and the page feels broken rather than expensive. Motion is the style's leading axis (5/6); janky motion is the style's death.
**Fix:** Set a performance budget before building — LOD levels, capped device pixel ratio (1.5-2), compressed textures (ASTC/WebP), and limited draw calls. Profile with the GPU panel; target 60fps on mid-range hardware. Post-processing like bloom and DOF should be optional quality tiers, not required.
---
Mistake 2: No Fallback for Low-End Devices
**What people do:** Assume WebGL works everywhere; ship a single heavy canvas and nothing else.
**Why it fails:** Older phones, weak GPUs, and software-rendering environments can't run the scene. The user gets a black square or a frozen frame where the hero product should be — and the entire page is built around that hero.
**Fix:** Detect WebGL support and device tier. Fall back to a static photorealistic render (from the same scene, pre-rendered) with the same studio lighting, or a simplified scene with reduced geometry and no post-processing. The fallback should still look art-directed — never a broken canvas.
---
Mistake 3: Unclear Affordance for Interaction
**What people do:** Ship orbit controls silently — the product spins on a timer and nothing hints that the user can drag, zoom, or scroll the camera.
**Why it fails:** Interaction is exploration (principle #2), but users won't explore what they can't discover. A self-rotating product reads as a video, not an interactive object. The showcase's whole value — handling the product — goes unused.
**Fix:** Visible affordance: a drag cursor on hover, a subtle "Drag to explore" hint that fades after first interaction, a scroll cue for the camera sequence. Rotation should be user-driven (with damping and inertia) rather than a constant gimmick.
---
Mistake 4: The Product Gets Lost in Effects
**What people do:** Add floating particles, fog, lens flares, dramatic camera swoops, and background scenery — because "3D should be spectacular."
**Why it fails:** The style is object theater: the product IS the show. Extra effects compete with the sculpture, slow the frame, and dilute the premium, showroom mood. When the user remembers the effects but not the product, the showcase has failed.
**Fix:** Restraint — the studio backdrop, soft shadows, and lighting exist to serve the product. Every effect must answer "what does this reveal about the product?" If it doesn't, cut it. The most premium showcases are the quietest.
---
Mistake 5: Gimmicky Rotation Without Purpose
**What people do:** Set the model spinning on a loop because "3D products should rotate."
**Why it fails:** Constant auto-rotation is motion without information — it's the 3D equivalent of a carousel. It reads as a tech demo, not a showcase, and it's actively hostile to reduced-motion users. Rotating the product tells the user nothing they can't see in one static frame.
**Fix:** Rotation must reveal: a material finish, an exploded view, a port, a hinge, a detail at a specific angle. Either the user drives the rotation (orbit controls with inertia), or the camera moves with scroll to tell a story — never mindless spinning.
---
Mistake 6: Unlit, Untreated Default Scenes
**What people do:** Import a model, drop a directional light on it, and ship the raw render with default tone mapping.
**Why it fails:** Without studio lighting (soft key, subtle fill, controlled rim) and photographic post-processing, the model looks like a grey-box placeholder — exactly the "default 3D asset look" this style exists to kill. Lighting is the texture: metal reflects, glass refracts, and matte absorbs because the light tells them to.
**Fix:** Art-direct the lighting like a photoshoot: key light that sculpts the form, fill that lifts shadows, rim that separates from the backdrop. Add an environment map for believable reflections, filmic tone mapping, and subtle depth of field. If the render wouldn't pass as a product photograph, it isn't done.
Reference Gallery
# Reference Gallery ## Live Sites ### Apple — Product Pages (apple.com/macbook-pro, /iphone) - **What works:** The canonical product-as-sculpture. Product centered, full-viewport, scroll-driven camera moves that reveal edges and materials; whisper-quiet UI; accent colors taken straight from the hardware - **URL:** apple.com ### Nike SNKRS — 3D Drops & Product Flips - **What works:** 120-second 3D product flips, colorway exploration, exploded-view reveals for sole and construction — direct references for sneaker/footwear versions of this style - **URL:** nike.com/snkrs (drop campaigns, product pages) ### Porsche — 3D Car Configurator (porsche.com/en/3d-configurator) - **What works:** The automotive configurator template — orbit controls, studio lighting, material swatches (paint/finish/trim), scroll-driven exterior→interior reveal - **URL:** porsche.com ### Dyson — Product Pages (dyson.com) - **What works:** Consumer-hardware hero — product spins on a light studio stage, spec labels float beside exploded parts, minimal chrome, neutral backdrop - **URL:** dyson.com ### BMW / Audi — Online Configurator - **What works:** 360° exterior + interior walk, paint/material transitions over consistent studio lighting — reference for finish-swap interactivity - **URL:** bmw.com / audi configurator ### holo3 / Spline Showcase (spline.design) - **What works:** Real-time WebGL scenes shipped with orbital controls and environment reflections — a directory of what three.js alternatives can achieve at speed - **URL:** spline.design ### Rog — Graphic Cards / ASUS Product Pages - **What works:** 3D component heroes with exploded views — see how exposed parts (chamber/metal) get mono spec labels floating beside them - **URL:** asus.com/rog --- ## Key Visual References ### Staging - **Studio stage** — neutral light gray center, dark background only as a material stage - **Contact shadow** — soft shadow plane directly under the object, so it "lands" - **Vignette** — subtle falloff toward the edges; never a flat fill ### Lighting - **Key** (45°, soft, warm) — the dominant shape-defining light - **Fill** (hemisphere, 0.08) — lifts shadows without washing out - **Rim** (tight spot behind) — separates the silhouette from the stage ### Materials - **Brushed metal** — anisotropy, roughness ~0.3, faint scratches - **Clearco lacquer** — clearcoat 1.0 + reflection blur - **Matte rubber** — roughness 0.85, no specular bounce - **Environment reflections** — HDR map, never flat/gray ### Motion - **Orbital drift** — auto-rotating at 0.08 rad/s, paused while dragging - **Scroll dolly** — camera moves with lerp, not snapping - **Exploded view** — 16px offsets, staggered 60ms, 900ms - **Material swap** — 500ms lerp of metalness/roughness/color ### Typography - **Product name** — a huge light uppercase display (Inter 200), track width - **Spec labels** — 11–12px mono (JetBrains Mono), tracking 0.08em - **No long body** — captions capped at 340px, 14–16px --- ## Screenshot Notes > When capturing references for this style, look for: > - The object (must be a real-time 3D render, not a flat photo) > - The stage (neutral, light-to-dark gradient, never busy) > - The lighting (key + fill + rim, soft shadows, contact shadow) > - The camera (orbit autopilot, scroll-driven dolly/pan/tilt, exploded view) > - The typography (huge light product name; tiny mono spec labels; no walls of copy) > - The accent color (taken from the product finish, not invented by the UI) > - The overall mood (sculptural, photorealistic, interactive, premium — a showroom) --- ## Notes - **Best references are product-live sites** allowing the interaction: Apple, Nike, Porsche/BMW/Audi configurators — study the *interaction*, not just the poster frame. - **Distinguish from flat site-to-product pages:** in "3D Product Showcase" the 3D model is the canvas, always. A page that uses a video mutation or a static photo is a different style (Luxury Refined Restraint / Dark Cinematic Studio).
AI Prompts
> Copy this entire prompt and paste it into your AI coding assistant.
---
```
Build a 3D product showcase page for "AURA" — a premium wireless headphone. Stack: React + Vite + TypeScript + Tailwind CSS v4 + React Three Fiber (Three.js) + @react-three/drei. Motion via useFrame + scroll-linked camera (lenis for smooth scroll). Page title: `AURA — The sculpture of sound`.
Vibe: The product is a sculptural object in a virtual studio. Photorealistic real-time 3D replaces photography. The user explores the product — orbiting, zooming, and rotating it like an object in a gallery. Studio lighting with a soft key, subtle fill, and a controlled rim. The interface is minimal; the product carries 95% of the weight.
---
## ANTI-SLOP CONSTRAINTS
- NO flat 2D product photos as primary imagery (the 3D model is the hero)
- NO 2D imagery only (a real-time 3D scene must render in the browser)
- NO busy backgrounds (neutral studio backdrop: light gray to dark, one subtle gradient)
- NO text-heavy layouts (product name + spec labels only; no paragraph blocks near the hero)
- NO cards around the product (specs in a minimal side panel or below, floating)
- NO harsh lighting (studio kit: key + fill + rim, soft shadows, contact shadow)
- NO harsh shadows or hard edges on the product (soft shadow and PBR falloff)
- NO plain colors for surfaces (PBR materials: metalness, roughness, clearcoat, environment reflections)
- NO clunky camera (orbital easing on drag; scroll-driven dolly/pan/tilt; no snapping)
- NO decorative UI noise (no borders, no grid clutter around the object)
---
## FONTS
Load via Google Fonts:
```
https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500&family=JetBrains+Mono:wght@400;500&display=swap
```
Usage (typography is quiet; the product is the typography):
- **Inter 200/300 UPPERCASE**: Product name — `clamp(3rem, 8vw, 7rem)`, tracking 0.02em, letter-spaced large, sentence per spec
- **Inter 400**: Short body captions — 14–16px, line-height 1.6, max-width 340px
- **JetBrains Mono 400**: Spec metadata — 11–12px, tracking 0.08em, uppercase, labels like `CURVATURE / PREFIX`
---
## COLOR SYSTEM
```css
:root {
--studio-50: #FAFAF9; /* Near-white key-canvas — light studio */
--studio-200: #E7E5E4; /* Light neutral for side panels */
--studio-700: #44403C; /* Graphite for spec text on light */
--stage-dark: #0A0A0B; /* Dark stage variant */
--stage-panel: rgba(10, 10, 11, 0.72); /* Translucent dark panel for specs */
--text-on-light: #1C1917;
--text-muted: rgba(28, 25, 23, 0.55);
--text-on-dark: rgba(250, 250, 249, 0.9);
--rim-accent: #C8C2BC; /* Borrowed from the product's brushed-metal finish */
}
```
- Stage default: `bg-[#FAFAF9] text-[#1C1917]` for the light studio.
- A **dark-studio variant** (`#0A0A0B`) is used for the material/finish section to dramatize reflections.
- Accent colors come **from the product itself** (its anodized blue, brushed steel, or leather tone) — never introduced as decoration.
---
## STRUCTURE
### 1. Hero — Full-Viewport Studio
- `min-h-[100dvh]`, full-viewport real-time 3D canvas (Three.js), product 200%–240% scale, centered, slightly tilted toward camera.
- Neutral light-gray studio backdrop with a soft vignette falloff (environment map, not a flat fill).
- Camera: gentle orbital drift paused on idle; drag = orbit; scroll = slow dolly-in.
- UI overlay (minimal, floating):
- Label top-left: `AURA / 01` — JetBrains Mono, 11px, uppercase, tracking 0.15em
- Product name bottom-left: `AURA` — Inter 200, uppercase, `clamp(3rem, 8vw, 7rem)`, text-on-dark
- One-liner under it: "Wireless headphones, sculpted for quiet." — Inter 400, 15px, text-muted
- CTA: "EXPLORE" — minimal underline button, white text on dark chip
### 2. Scroll-Driven Camera Sequence (3 steps)
Scroll drives the camera; each new viewport is a new shot:
- Shot 1: Full front — camera dollies from 4m to 1.8m (scripted by scroll progress).
- Shot 2: Tilt — camera arcs to 45° and tilts down onto the ear-cup (scroll 40–60%).
- Shot 3: Top-down explode — exploded view (cups lift, band separates, driver exposed) with a subtle 360° orbit.
- Spec labels float beside the relevant part as it separates (e.g., `40MM DRIVER / 61MM DIAPHRAGM`).
### 3. Specs Section (minimal panel)
- Split layout: left = persistent 3D product (mini canvas, slow self-orbit), right = spec list in JetBrains Mono, thin hairline separators.
- Spec rows: `BATTERY 40H`, `WEIGHT 254G`, `CODEC LDAC · AAC · SBC`,
- Right column max-width 280px, generous whitespace.
### 4. Finish / Materials Section (dark stage)
- Dark `#0A0A0B` stage, same 3D model, close-up camera.
- Material/finish transitions: click a swatch (`MATTE`, `TRU-BRUSHED`, `GLOSS`) and the PBR material cross-fades live on the model.
- Reflections pop on the dark backdrop (stronger env map, visible clearcoat); soft shadow remains under the product.
### 5. Footer
- Back to light canvas; minimal, product silhouette faint in background.
- `AURA © 2026 — DESIGNED IN THE STUDIO` — Inter 400, 12px, uppercase, tracking 0.18em
---
## LIGHTING (KEY / FILL / RIM)
- **Key:** Area light, 45° above-front right, 1.0 intensity, size ~4 — soft predominant light.
- **Fill:** Ambient + HemisphereLight from behind-left, 0.08 — lifts shadows without flattening.
- **Rim:** SpotLight behind-top-left, ~0.5, tight cone — defines the eyebrow/rim against the stage.
- **Environment:** Studio HDR environment map for reflections (PBR: metalness 0.6–1.0, roughness 0.1–0.35, clearcoat 0.4–1.0).
- **Shadows:** Contact shadow plane + soft shadowMap blur (PCFSoft), not a hard blob.
---
## MOTION
| Element | Animation | Duration | Easing |
|---------|-----------|----------|--------|
| Product entrance | camera dolly 4m → 1.8m + slight rotation settle | 1400ms | `ease-out-cubic` |
| Idle orbit | gentle self-rotation, 0.02 rad/s | — | linear, paused on drag |
| Scroll camera | dolly / pan / tilt driven by scroll progress | scroll | lerp 0.08 smoothing |
| Exploded view | part offsets 16px + z-lift, staggered | 900ms | `ease-out` (stagger 60ms) |
| Material swap | PBR values lerp (metalness, roughness, color) | 500ms | `ease-out` |
| Spec labels | opacity 0 → 1 + translateY(8px)→0 | 700ms | ease-out, viewport-triggered |
`prefers-reduced-motion: reduce` → static camera (no orbit, no scroll-dolly), instant transitions, exploded view plays once on click only.
---
## ANTI-SLOP (LOCKED)
- Real-time 3D product model (three.js / R3F / Spline) as the hero
- Orbital + scroll-driven camera (dolly, pan, tilt) — interaction is exploration
- Studio lighting: key, fill, rim + soft shadows + shadow contact
- PBR materials with environment reflections (metalness/roughness/clearcoat)
- Minimal UI around the product — chrome is invisible
- Neutral studio background (light gray → dark). No busy art direction
- No flat 2D product photos as primary. No text-heavy panels near the object
- Typography stays quiet (tiny mono spec labels, huge light-weight product name)
- Slow, deliberate motion — nothing snappy, nothing auto-playing faster than 400ms
---
Recreate this page with an identical photorealistic studio aesthetic — real-time 3D product, orbital + scroll camera, key/fill/rim studio rig, PBR reflections, and a whisper-quiet minimal interface.
```This prompt recreates a specific design pixel-faithfully. Study it to understand the style at its purest.