AI Skill Report Card

Building Three.js Product Visualizations

A-82·Feb 25, 2026·Source: Web
15 / 15
JavaScript
import { Canvas } from '@react-three/fiber' import { OrbitControls, Environment, useGLTF } from '@react-three/drei' import { Suspense } from 'react' function ProductViewer({ modelPath }) { const { scene } = useGLTF(modelPath) return ( <Canvas camera={{ position: [5, 2, 5], fov: 45 }}> <Environment files="/hdri/studio_small_03_1k.hdr" /> <directionalLight position={[10, 10, 5]} intensity={0.5} /> <ambientLight intensity={0.2} /> <Suspense fallback={null}> <primitive object={scene} /> </Suspense> <OrbitControls enablePan={false} maxPolarAngle={Math.PI / 2} /> </Canvas> ) }
Recommendation
Add concrete file size numbers and performance benchmarks in examples (e.g., 'Model reduced from 5MB to 800KB with Draco compression')
13 / 15

Progress:

  • Set up scene foundation (renderer, camera, controls)
  • Configure lighting rig with HDRI + directional balance
  • Optimize GLTF models (Draco compression, LOD)
  • Implement scroll animations with GSAP ScrollTrigger
  • Build React Three Fiber component architecture
  • Add lazy loading for performance
  • Test conversion-focused interactions

1. Scene Foundation Setup

JavaScript
// Canvas configuration for B2B product demos <Canvas gl={{ antialias: true, alpha: true }} camera={{ position: [5, 2, 5], fov: 45 }} dpr={[1, 2]} > <OrbitControls enablePan={false} enableZoom={true} maxPolarAngle={Math.PI / 2} minDistance={3} maxDistance={15} /> </Canvas>

2. Lighting Rig for Product Showcases

JavaScript
function ProductLighting() { return ( <> {/* HDRI environment for realistic reflections */} <Environment files="/hdri/studio_small_03_1k.hdr" /> {/* Key light - directional */} <directionalLight position={[10, 10, 5]} intensity={0.5} castShadow shadow-mapSize={[2048, 2048]} /> {/* Fill light - ambient */} <ambientLight intensity={0.2} /> {/* Rim light for edge definition */} <directionalLight position={[-5, 5, -5]} intensity={0.3} /> </> ) }

3. Model Optimization Strategy

Bash
# Draco compression (reduce file size 60-80%) gltf-pipeline -i model.gltf -o model-compressed.glb --draco.compressionLevel 10 # Generate LOD versions gltf-pipeline -i model.gltf -o model-low.glb --meshopt.simplification.ratio 0.5
JavaScript
function OptimizedModel({ modelPath, distance }) { const lowRes = useGLTF(`${modelPath}-low.glb`) const highRes = useGLTF(`${modelPath}.glb`) return ( <Lod distances={[15, 25, 35]}> <primitive object={highRes.scene} /> <primitive object={lowRes.scene} /> <mesh /> {/* Fallback placeholder */} </Lod> ) }

4. Scroll-Linked Camera Animation

JavaScript
import { useLayoutEffect, useRef } from 'react' import { useThree } from '@react-three/fiber' import gsap from 'gsap' import { ScrollTrigger } from 'gsap/ScrollTrigger' function ScrollCameraRig() { const { camera } = useThree() const timeline = useRef() useLayoutEffect(() => { timeline.current = gsap.timeline({ scrollTrigger: { trigger: ".product-section", start: "top center", end: "bottom center", scrub: 1 } }) // Product reveal animation timeline.current .to(camera.position, { x: 0, y: 3, z: 8, duration: 1 }) .to(camera.position, { x: -5, y: 2, z: 5, duration: 1 }) .to(camera.position, { x: 5, y: 1, z: 3, duration: 1 }) return () => timeline.current?.kill() }, [camera]) return null }

5. Component Architecture

JavaScript
// ProductVisualization.jsx function ProductVisualization({ product, interactive = true }) { return ( <div className="product-visualization"> <Canvas> <Suspense fallback={<ProductLoader />}> <ProductScene product={product} /> <ProductLighting /> {interactive && <ProductInteractions />} <ScrollCameraRig /> </Suspense> </Canvas> <ProductControls product={product} /> </div> ) } // ProductScene.jsx function ProductScene({ product }) { const { scene } = useGLTF(product.modelPath) return ( <group> <primitive object={scene} /> <ProductMaterials variants={product.variants} /> <ProductAnnotations features={product.features} /> </group> ) }

6. Lazy Loading Implementation

JavaScript
import { lazy, Suspense } from 'react' const ProductVisualization = lazy(() => import('./ProductVisualization')) function ProductSection() { const [loadVisualization, setLoadVisualization] = useState(false) useEffect(() => { const observer = new IntersectionObserver(([entry]) => { if (entry.isIntersecting) { setLoadVisualization(true) } }) observer.observe(document.querySelector('.product-trigger')) return () => observer.disconnect() }, []) return ( <section className="product-section"> <div className="product-trigger" /> {loadVisualization && ( <Suspense fallback={<div>Loading 3D Experience...</div>}> <ProductVisualization /> </Suspense> )} </section> ) }
Recommendation
Include actual conversion rate improvements or business metrics from implementing these visualizations
15 / 20

Example 1: B2B Software Dashboard Demo Input: SaaS dashboard product with multiple screens Output: 3D floating screens with smooth transitions, scroll-triggered feature highlights, interactive hotspots showing key benefits

Example 2: Industrial Equipment Showcase Input: Heavy machinery CAD model Output: Cutaway animations revealing internal components, configurable parts with material variants, performance metrics overlay

Example 3: Mobile App Presentation Input: Mobile app interface mockups Output: Rotating phone models with screen transitions, gesture-based interactions, conversion-focused call-to-action integration

Recommendation
Provide more specific HDRI recommendations with actual file names and lighting scenarios for different product types
  • File Size: Keep initial bundle < 500KB, lazy load 3D models
  • Performance: Target 60fps on mid-range devices, use LOD for distant objects
  • HDRI Selection: Studio lighting HDRIs work best for product visualization
  • Camera Movement: Smooth, predictable paths that enhance product understanding
  • Fallbacks: Always provide 2D alternatives for unsupported devices
  • Conversion Focus: Position interactive elements near purchase/demo CTAs
  • Mobile Optimization: Reduce polygon count 50% for mobile, simplify materials
  • Loading full-resolution models immediately (kills performance)
  • Using too many light sources (causes visual confusion)
  • Scroll animations that fight user control
  • Missing shadows/reflections (makes products look flat)
  • No loading states (poor UX during model fetch)
  • Overdoing camera movements (causes motion sickness)
  • Ignoring WebGL support detection
  • Not testing on actual mobile devices
  • Complex materials without LOD fallbacks
0
Grade A-AI Skill Framework
Scorecard
Criteria Breakdown
Quick Start
15/15
Workflow
13/15
Examples
15/20
Completeness
12/20
Format
15/15
Conciseness
12/15