AI Skill Report Card
Optimizing 3D Assets for Web
Quick Start15 / 15
JavaScript// Basic Three.js setup with optimized loading import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'; import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'; import { KTX2Loader } from 'three/examples/jsm/loaders/KTX2Loader.js'; const dracoLoader = new DRACOLoader(); dracoLoader.setDecoderPath('/draco/'); const ktx2Loader = new KTX2Loader(); ktx2Loader.setTranscoderPath('/basis/'); const loader = new GLTFLoader(); loader.setDRACOLoader(dracoLoader); loader.setKTX2Loader(ktx2Loader); // Progressive loading: placeholder → low-poly → full quality loader.load('model_placeholder.gltf', (placeholder) => { scene.add(placeholder.scene); loader.load('model_lowpoly.gltf', (lowpoly) => { scene.remove(placeholder.scene); scene.add(lowpoly.scene); loader.load('model_full.gltf', (full) => { scene.remove(lowpoly.scene); scene.add(full.scene); }); }); });
Recommendation▾
Add more concrete input/output examples with actual file sizes and performance metrics from real projects
Workflow15 / 15
Blender Export Configuration
-
Apply Modifiers
- Select all objects → Object → Apply → All Transforms
- Apply subdivision surface, mirror, array modifiers
- Keep only essential armature/shape key modifiers
-
Geometry Optimization
- Switch to Edit mode → Select All (A)
- Mesh → Clean Up → Merge by Distance (0.001m threshold)
- Face → Triangulate Faces
- UV → Smart UV Project (angle limit: 66°, margin: 0.001)
-
GLTF Export Settings
Format: glTF Binary (.glb) ☑ Apply Modifiers ☑ UVs ☑ Normals ☑ Tangents ☑ Materials: Export ☑ Compression: Enable Transform: +Y Up
Draco Compression Implementation
Geometry Compression Ratios:
- Position: 14 bits (high precision for hero assets)
- Normal: 10 bits (sufficient for most lighting)
- UV: 12 bits (texture coordinate precision)
- Color: 8 bits per channel
Command Line Implementation:
Bash# Install Draco tools npm install -g gltf-pipeline # Compress with optimal settings gltf-pipeline -i model.gltf -o model_compressed.gltf --draco.compressionLevel=7 --draco.quantizePositionBits=14 --draco.quantizeNormalBits=10 --draco.quantizeTexcoordBits=12
Texture Optimization Pipeline
-
Source Preparation
- Albedo: 1024×1024px max, sRGB
- Normal: 1024×1024px max, Linear
- Roughness/Metallic: 512×512px, pack into single texture (R=roughness, G=metallic, B=AO)
-
KTX2 Conversion
Bash# Install Basis Universal tools npm install -g @gltf-transform/cli # Convert textures gltf-transform etc1s model.gltf model_ktx2.gltf --level 1 --quality 128 -
Mipmap Strategy
- Generate full mipmap chain
- Use trilinear filtering
- Budget: 16MB VRAM total across all textures
Progressive Loading Implementation
Three-tier system:
- Placeholder (< 100KB): Simple geometry, solid colors
- Low-poly (< 1MB): Reduced geometry, compressed textures (256px)
- Full quality (< 4MB): Full geometry, full-res textures
Recommendation▾
Include a troubleshooting section with specific error messages and solutions for common compression/loading failures
Pre-Deployment Checklist
Progress:
-
Geometry Check
- Triangle count < 50K per model
- No n-gons or invalid faces
- UV islands fit 0-1 space with 2px padding
- No overlapping faces or duplicate vertices
-
Material Optimization
- Max 4 materials per model
- Textures power-of-2 dimensions
- Combined roughness/metallic/AO maps
- Normal maps in OpenGL format (+Y up)
-
File Size Validation
- Placeholder model < 100KB
- Low-poly model < 1MB
- Full model < 4MB
- Total scene bundle < 5MB
-
Compression Applied
- Draco geometry compression enabled
- KTX2/Basis texture compression
- GLTF binary format (.glb)
-
Performance Testing
- Loads in < 2s on throttled 4G (1.6Mbps)
- Maintains 60fps on mid-tier mobile
- Memory usage < 100MB total
- Tested on iOS Safari, Chrome Android, Desktop
-
Progressive Loading
- Placeholder appears in < 200ms
- Low-poly transition smooth
- No visual pop during upgrades
Examples15 / 20
Example 1: E-commerce Product Model Input: 200K triangle CAD model with 4K textures Output:
- Placeholder: 500 triangles, 64×64 textures (80KB)
- Low-poly: 5K triangles, 512×512 textures (800KB)
- Full: 25K triangles, 1024×1024 textures (2.8MB)
Example 2: Architectural Visualization Input: 2M triangle building model Output: LOD system with distance-based loading, instanced geometry for repetitive elements, 4.2MB total
Recommendation▾
Provide fallback strategies for when Draco or KTX2 compression isn't supported by the target browser
Best Practices
- Texture Atlasing: Combine small textures into single atlas to reduce draw calls
- Instancing: Use for repeated elements (screws, bolts, vegetation)
- Level of Detail: Create 3-4 LOD levels based on screen space size
- Occlusion Culling: Remove interior faces never seen by camera
- Vertex Colors: Use for simple variations instead of unique textures
Common Pitfalls
- Forgetting to apply modifiers before export (breaks compression)
- Using non-power-of-2 texture dimensions (poor GPU performance)
- Over-compressing normal maps (causes lighting artifacts)
- Not testing on actual mobile devices (performance varies widely)
- Ignoring texture memory budget (causes crashes on low-end devices)
- Missing fallbacks for unsupported compression formats