בפרק 10 למדתם Canvas — ציור פיקסלי בדפדפן, מערכות חלקיקים, ורקעים פרוצדורליים. עכשיו אנחנו עוברים למימד נוסף — פשוטו כמשמעו. תלת-מימד באינטרנט כבר לא שמור רק למשחקים ולסימולציות מדעיות. אתרי e-commerce מציגים מוצרים שמסתובבים, סטארטאפים בונים hero sections עם אובייקטים תלת-ממדיים צפים, ומותגים יוצרים חוויות אינטראקטיביות שגורמות למבקרים לחזור. Three.js הוא המנוע שמריץ את רוב ה-3D באינטרנט. Spline הוא העורך הוויזואלי שמאפשר ל-Vibe Coders ליצור סצנות 3D בלי לכתוב שורת קוד אחת. React Three Fiber הופך את Three.js לקומפוננטות React דקלרטיביות. ובפרק הזה תלמדו את שלושתם — מתי להשתמש בכל אחד, איך לשלב 3D באתר, ואיך לבקש מ-AI אלמנטים תלת-ממדיים שהופכים אתר רגיל לחוויה.
בפרק 10 בניתם מערכות חלקיקים ורקעים פרוצדורליים עם Canvas. בפרק הזה תוסיפו מימד שלישי — פשוטו כמשמעו. תלמדו ליצור סצנת 3D ב-Spline, לייצא אותה לאתר, ולהוסיף אינטראקטיביות. תבנו product viewer שמסתובב עם העכבר, hero section עם אובייקטים תלת-ממדיים צפים, או טקסט 3D שמגיב לגלילה. בפרק 12 תלמדו צלילים ומיקרו-אינטראקציות — הפרטים הקטנים שהופכים את כל האנימציות שלמדתם עד עכשיו לחוויה שלמה.
| מונח (English) | תרגום | הגדרה |
|---|---|---|
| WebGL | וב-ג'י-אל | ממשק JavaScript שמאפשר לדפדפן לרנדר גרפיקה דו-ממדית ותלת-ממדית באמצעות ה-GPU. הבסיס שעליו Three.js בנוי — אתם לא כותבים WebGL ישירות, אבל חשוב להבין שהוא קיים |
| Three.js | ת'רי-ג'יי-אס | ספריית JavaScript לתלת-מימד בדפדפן — 2.7 מיליון הורדות שבועיות. עוטפת את WebGL ומספקת scene, camera, renderer, geometries, materials, lights — כל מה שצריך ל-3D |
| Spline | ספליין | עורך 3D ויזואלי בדפדפן — drag-and-drop ליצירת סצנות תלת-ממדיות. הכלי המושלם ל-Vibe Coders: מעצבים ויזואלית, מייצאים לקוד |
| React Three Fiber | ריאקט ת'רי פייבר | ספרייה שהופכת את Three.js לקומפוננטות React דקלרטיביות. במקום new THREE.Mesh() כותבים <mesh>. מאפשרת לשלב 3D בפרויקט React בצורה טבעית |
| scene | סצנה | המרחב התלת-ממדי שמכיל את כל האובייקטים, האורות והמצלמות. חשבו על זה כ-stage בתיאטרון — הבמה שעליה הכל קורה |
| camera | מצלמה | נקודת המבט שממנה הצופה רואה את הסצנה. PerspectiveCamera מחקה עין אנושית (עם פרספקטיבה — קרוב גדול, רחוק קטן) |
| renderer | מרנדר | המנוע שלוקח את הסצנה והמצלמה ומצייר אותם על Canvas. WebGLRenderer הוא הנפוץ ביותר — משתמש ב-GPU לביצועים גבוהים |
| mesh | רשת / מש | אובייקט תלת-ממדי = geometry (צורה) + material (חומר). כל דבר שאתם רואים בסצנת 3D הוא mesh — קוביה, כדור, מודל של מכונית |
| geometry | גיאומטריה | הצורה של אובייקט 3D — אוסף קודקודים (vertices) ומשולשים (faces). Three.js מספק צורות מובנות: BoxGeometry, SphereGeometry, PlaneGeometry ועוד |
| material | חומר | המראה של אובייקט 3D — צבע, ברק, שקיפות, טקסטורה. MeshStandardMaterial מחקה חומרים פיזיקליים (מתכת, פלסטיק, עץ) |
| GLTF / GLB | ג'י-אל-טי-אף | פורמט הסטנדרט להעברת מודלים תלת-ממדיים באינטרנט. GLTF = JSON + קבצים נפרדים. GLB = הכל בקובץ בינארי אחד (מומלץ לשימוש באתרים) |
| drei | דרייי | ספריית helper components ל-React Three Fiber — OrbitControls, Environment, Float, Text3D, Sparkles ועוד עשרות קומפוננטות מוכנות שחוסכות מאות שורות קוד |
| OrbitControls | שליטת מסלול | קומפוננטה שמאפשרת למשתמש לסובב את הסצנה עם העכבר (drag), לזום (scroll), ולהזיז (right-click). חובה ב-product viewers |
| environment map | מפת סביבה | תמונה פנורמית (HDR) שעוטפת את הסצנה ומשתקפת באובייקטים — יוצרת תאורה ריאליסטית ושיקופים. ההבדל בין 3D שנראה מזויף ל-3D שנראה אמיתי |
| PBR (Physically Based Rendering) | רנדור מבוסס פיזיקה | שיטת רנדור שמחקה את הפיזיקה של אור אמיתי — metalness (כמה מתכתי), roughness (כמה מחוספס). MeshStandardMaterial ו-MeshPhysicalMaterial משתמשים ב-PBR |
כל מה שאתם רואים במסך — כל פיקסל, כל צבע, כל צורה — מצויר על ידי ה-GPU (Graphics Processing Unit). כשאתם כותבים CSS או Canvas 2D, הדפדפן מתרגם את הפקודות שלכם ל-GPU בשבילכם. אבל כשמדברים על תלת-מימד — על אובייקטים עם עומק, פרספקטיבה, תאורה, צללים, ושיקופים — צריך לדבר עם ה-GPU ישירות. וזה מה ש-WebGL עושה.
WebGL (Web Graphics Library) הוא API של JavaScript שמאפשר לדפדפן לשלוח פקודות ישירות ל-GPU. הוא מבוסס על OpenGL ES — אותו ה-API שמריץ גרפיקה במשחקי מובייל. WebGL קיים בכל הדפדפנים המודרניים מ-2011, ויש לו גרסה חדשה — WebGPU — שיותר מהירה ויעילה (נכנסת בהדרגה מ-2023).
אבל הנה הבעיה: WebGL קשה. קשה מאוד. כדי לצייר משולש אחד ב-WebGL צריכים לכתוב vertex shader (תוכנה שרצה על ה-GPU ומגדירה את מיקום כל קודקוד), fragment shader (תוכנה שרצה על ה-GPU ומגדירה את הצבע של כל פיקסל), buffer objects (מערכי נתונים שמועברים ל-GPU), ועשרות שורות של boilerplate code. רק משולש אחד — כ-100 שורות קוד.
זו בדיוק הסיבה שנוצרו abstractions — שכבות שמסתירות את המורכבות של WebGL ומאפשרות לכם לעבוד ברמה גבוהה יותר:
new THREE.Mesh() כותבים <mesh>. אם אתם עובדים ב-React — זה הכלי שלכםבכל הפרק הזה, לא תכתבו שורת WebGL אחת. אתם צריכים להבין שהוא קיים — כי כשמשהו לא עובד, הודעות השגיאה יהיו של WebGL. אבל כל העבודה שלכם תהיה ברמת Three.js, React Three Fiber, או Spline. זה כמו שאתם לא כותבים Assembly כשאתם כותבים JavaScript — אתם עובדים ברמת abstraction גבוהה יותר.
למה 3D באתרים בכלל? שלוש סיבות מעשיות:
ומה שהשתנה ב-2024-2026: הכלים הפכו נגישים. Three.js דורש ידע ב-JavaScript, אבל Spline מאפשר ל-designer ליצור סצנת 3D שלמה בלי שורת קוד. React Three Fiber עם drei מאפשרים product viewer ב-20 שורות. וכלי AI כמו Bolt, Lovable ו-Cursor יודעים לייצר קוד Three.js ו-R3F ברמה מרשימה. 3D באינטרנט כבר לא "רק למפתחים מנוסים".
Three.js נוצר ב-2010 על ידי Ricardo Cabello (Mr.doob) ומאז הפך לסטנדרט de facto לתלת-מימד באינטרנט. יותר מ-2.7 מיליון הורדות שבועיות ב-npm, אלפי דוגמאות רשמיות, קהילה ענקית, ותיעוד מצוין. כל מה שאתם רואים ב-3D באינטרנט — כמעט תמיד Three.js מתחת למכסה המנוע.
הרעיון המרכזי של Three.js (ושל כל מנוע 3D) מבוסס על שלושה מרכיבים הכרחיים:
ואז מוסיפים אובייקטים. כל אובייקט תלת-ממדי ב-Three.js הוא Mesh — שילוב של שני דברים:
ולבסוף — אור. בלי אור, כל האובייקטים שחורים (חוץ מ-MeshBasicMaterial שלא מושפע מתאורה). סוגי האור הבסיסיים:
ככה זה נראה בקוד — סצנת Three.js מינימלית עם קוביה:
// סצנת Three.js מינימלית — קוביה מסתובבת
import * as THREE from 'three';
// 1. סצנה — המרחב התלת-ממדי
const scene = new THREE.Scene();
scene.background = new THREE.Color(0x111111);
// 2. מצלמה — נקודת המבט
const camera = new THREE.PerspectiveCamera(
75, // FOV — שדה ראייה
window.innerWidth / window.innerHeight, // aspect ratio
0.1, // near — הכי קרוב שנראה
1000 // far — הכי רחוק שנראה
);
camera.position.z = 5; // הרחקנו את המצלמה 5 יחידות אחורה
// 3. רנדרר — מנוע הציור
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
document.body.appendChild(renderer.domElement);
// 4. Mesh = Geometry + Material
const geometry = new THREE.BoxGeometry(1, 1, 1); // קוביה 1x1x1
const material = new THREE.MeshStandardMaterial({
color: 0x6366f1, // סגול
metalness: 0.3, // קצת מתכתי
roughness: 0.4 // קצת חלק
});
const cube = new THREE.Mesh(geometry, material);
scene.add(cube); // הוספה לסצנה
// 5. אורות
const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
scene.add(ambientLight);
const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
directionalLight.position.set(5, 5, 5);
scene.add(directionalLight);
// 6. Animation loop — לולאת אנימציה
function animate() {
requestAnimationFrame(animate);
cube.rotation.x += 0.01; // סיבוב על ציר X
cube.rotation.y += 0.01; // סיבוב על ציר Y
renderer.render(scene, camera);
}
animate();
// 7. Responsive — התאמה לשינוי גודל חלון
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
});
40 שורות — וזה כל מה שצריך לקוביה מסתובבת עם תאורה. שימו לב ל-pattern: יוצרים scene → camera → renderer → meshes → lights → animation loop. זה ה-pattern הבסיסי של כל אפליקציית Three.js.
https://unpkg.com/three@0.170.0/build/three.module.js| קריטריון | Three.js (Vanilla) | Spline | React Three Fiber |
|---|---|---|---|
| קהל יעד | מפתחי JS שרוצים שליטה מלאה | מעצבים ו-Vibe Coders — בלי קוד | מפתחי React |
| Learning curve | בינוני — צריך JS טוב | נמוך — GUI ויזואלי | בינוני — צריך React + R3F |
| גמישות | מלאה — כל דבר אפשרי | מוגבלת לעורך, אבל מספיקה ל-90% מהשימושים | מלאה — כל Three.js זמין |
| ביצועים | מצוינים — שליטה מלאה ב-optimization | טובים — Spline Runtime אופטימלי | מצוינים — Three.js + React reconciler |
| אינטראקטיביות | כל דבר — אבל צריך לקודד | אינטראקציות מובנות: hover, click, scroll | כל דבר — עם event system של React |
| ייצוא | לא רלוונטי — הקוד הוא התוצר | React component, iframe, image, video, GLTF | לא רלוונטי — React component |
| AI friendliness | גבוהה — AI כותב Three.js היטב | בינונית — Spline AI קיים אבל מוגבל | גבוהה — AI כותב R3F היטב |
| שימוש נפוץ | פרויקטים מורכבים, gaming, data viz | hero sections, product viewers, marketing sites | פרויקטי React עם אלמנטים 3D |
כלל אצבע ל-Vibe Coders: התחילו עם Spline. אם Spline לא מספיק — בקשו מ-AI קוד React Three Fiber. Three.js vanilla — רק לפרויקטים שלא ב-React ולא ב-Spline.
גם סצנת 3D פשוטה צורכת יותר GPU ו-CPU מכל אנימציית CSS, GSAP, או Lottie. לפני שמוסיפים 3D — שאלו: "האם התלת-מימד פה מוסיף ערך שלא ניתן להשיג אחרת?" אם product viewer שמסתובב — כן, זה שווה. אם טקסט 3D רק כי "זה נראה cool" — כנראה שלא. סעיף 11.9 מכסה performance בפירוט, אבל הכלל: 3D כמו מלח — קצת משפר, הרבה הורס.
אם Three.js הוא "כתוב קוד ותקבל 3D", Spline הוא "עצב ויזואלית ותקבל 3D". Spline הוא עורך תלת-ממדי שרץ בדפדפן — לא צריך להתקין כלום. פותחים את spline.design, נרשמים (חשבון חינמי), ומתחילים ליצור. הממשק דומה ל-Figma — שכבות בצד, toolbar למעלה, properties panel בצד השני. אבל במקום עיגולים ומלבנים, יש לכם קוביות, כדורים, טורוסים, ותאורה תלת-ממדית.
למה Spline קריטי ל-Vibe Coders:
הממשק של Spline — מה יש בפנים:
שיטות ייצוא מ-Spline:
@splinetool/react-spline. מקבלים קומפוננטה שמטענת את הסצנה. שליטה מלאה ב-events@splinetool/runtime. טוען את הסצנה לתוך Canvas element. לפרויקטים שלא ב-React// שילוב Spline באתר — React Component
import Spline from '@splinetool/react-spline';
function Hero3D() {
function onLoad(splineApp) {
// אפשר לגשת לאובייקטים בסצנה
const cube = splineApp.findObjectByName('Cube');
console.log('Spline scene loaded!', cube);
}
function onMouseHover(e) {
// e.target.name — שם האובייקט שה-hover עליו
console.log('Hovering:', e.target.name);
}
return (
<div style={{ width: '100%', height: '500px' }}>
<Spline
scene="https://prod.spline.design/YOUR-SCENE-ID/scene.splinecode"
onLoad={onLoad}
onMouseHover={onMouseHover}
/>
</div>
);
}
// שילוב Spline באתר — Vanilla JS
import { Application } from '@splinetool/runtime';
const canvas = document.getElementById('canvas3d');
const app = new Application(canvas);
app.load('https://prod.spline.design/YOUR-SCENE-ID/scene.splinecode')
.then(() => {
const cube = app.findObjectByName('Cube');
// שליטה פרוגרמטית באובייקט
cube.position.x = 2;
cube.rotation.y = Math.PI / 4;
});
החשבון החינמי מאפשר יצירה מלאה, אבל הייצוא מגיע עם watermark של Spline. תוכנית Starter ($12/חודש) מסירה את ה-watermark ומוסיפה code export. Professional ($20/חודש) מוסיפה team features ו-unlimited exports. ל-Vibe Coders: התחילו חינם ללמוד, שדרגו רק כשצריך ייצוא נקי לפרויקט אמיתי. Spline AI (text-to-3D) דורש תוסף נפרד של $5/חודש.
Spline vs Blender — שאלה שנשאלת הרבה. Blender הוא הכלי המקצועי ביותר ליצירת מודלים תלת-ממדיים — חינמי, open source, עם יכולות שלא מתקרבים אליהם. אבל Blender דורש חודשים של למידה ומיועד ליצירת assets (מודלים, טקסטורות, אנימציות) — לא לבניית סצנות web. Spline מיועד ל-web-native — מעצבים, מוסיפים אינטראקציות, ומייצאים ישירות לאתר. אם צריך מודל מורכב של מכונית — Blender (או Sketchfab). אם צריך hero section עם צורות 3D — Spline.
Spline Community ו-Remix: אחד הדברים הכי שימושיים ב-Spline הוא ה-Community. ב-community.spline.design יש אלפי סצנות מוכנות — hero sections, product viewers, interactive backgrounds, 3D icons, ועוד. אפשר לעשות Remix לכל סצנה — זה פותח אותה בעורך שלכם כעותק שאפשר לערוך. זו הדרך הכי מהירה להתחיל: מוצאים סצנה שדומה למה שצריך, עושים Remix, משנים צבעים וחומרים, ומייצאים. במקום לבנות מאפס — מתאימים אישית. זה בדיוק הגישה של Vibe Coding — להשתמש בכלים קיימים ולהתאים, לא לבנות מאפס.
אם אתם עובדים עם React (וב-2026, רוב ה-Vibe Coders עובדים עם Next.js שהוא React), React Three Fiber (R3F) הוא הדרך הנכונה לשלב 3D. במקום הגישה האימפרטיבית של Three.js (new THREE.Mesh(geometry, material)), R3F מאפשר גישה דקלרטיבית — מתארים את הסצנה כ-JSX:
// React Three Fiber — אותה קוביה, בגישה דקלרטיבית
import { Canvas } from '@react-three/fiber';
function RotatingCube() {
const meshRef = useRef();
// useFrame רץ כל frame (~60fps) — מושלם לאנימציות
useFrame((state, delta) => {
meshRef.current.rotation.x += delta;
meshRef.current.rotation.y += delta * 0.5;
});
return (
<mesh ref={meshRef}>
<boxGeometry args={[1, 1, 1]} />
<meshStandardMaterial color="#6366f1" metalness={0.3} roughness={0.4} />
</mesh>
);
}
function App() {
return (
<Canvas camera={{ position: [0, 0, 5], fov: 75 }}>
<ambientLight intensity={0.5} />
<directionalLight position={[5, 5, 5]} intensity={1} />
<RotatingCube />
</Canvas>
);
}
שימו לב למה שקרה כאן:
<Canvas> יוצרת scene, camera, renderer אוטומטיתuseFrame hook מחליף את requestAnimationFrameהקסם של R3F: כל מה שקיים ב-Three.js זמין ב-R3F — פשוט עם תחביר JSX. THREE.BoxGeometry → <boxGeometry>, THREE.MeshStandardMaterial → <meshStandardMaterial>, THREE.DirectionalLight → <directionalLight>. השם הופך מ-PascalCase ל-camelCase, והפרמטרים עוברים כ-props. כל class ב-Three.js הופך אוטומטית לקומפוננטה.
Events ב-R3F — ואחד הדברים הכי חזקים. ב-Three.js vanilla, אם רוצים לזהות click על אובייקט — צריך raycasting (לירות קרן מהמצלמה דרך נקודת הקליק ולבדוק מה היא פוגעת). ב-R3F, זה פשוט event handler:
// Events ב-R3F — פשוט כמו React רגיל
function InteractiveCube() {
const [hovered, setHovered] = useState(false);
const [clicked, setClicked] = useState(false);
return (
<mesh
onClick={() => setClicked(!clicked)}
onPointerOver={() => setHovered(true)}
onPointerOut={() => setHovered(false)}
scale={clicked ? 1.5 : 1}
>
<boxGeometry />
<meshStandardMaterial color={hovered ? '#ff6b6b' : '#6366f1'} />
</mesh>
);
}
Click, hover, drag — כל מה שאתם רגילים מ-React, עובד גם על אובייקטים תלת-ממדיים. זו הסיבה שפרויקטי React מעדיפים R3F על Three.js vanilla — ה-3D מרגיש כמו חלק טבעי מהאפליקציה, לא כמו עולם נפרד.
npm install @react-three/fiber threeR3F לבד הוא Three.js כ-React — וזה נהדר. אבל עדיין צריך לכתוב הרבה boilerplate: controls למצלמה, environment maps, loading indicators, text 3D. ספריית drei (בגרמנית: שלוש) היא אוסף של עשרות קומפוננטות מוכנות שעוטפות את ה-patterns הנפוצים ביותר. היא בפועל חובה בכל פרויקט R3F.
הקומפוננטות שתשתמשו בהן הכי הרבה:
OrbitControls — שליטת מצלמה עם העכבר. העמוד השדרה של כל product viewer:
import { Canvas } from '@react-three/fiber';
import { OrbitControls } from '@react-three/drei';
function ProductViewer() {
return (
<Canvas>
<OrbitControls
enableZoom={true} // גלגלת = זום
enablePan={false} // לא מאפשר הזזה
autoRotate={true} // מסתובב אוטומטית
autoRotateSpeed={2} // מהירות הסיבוב
minDistance={3} // מרחק מינימלי מהאובייקט
maxDistance={10} // מרחק מקסימלי
maxPolarAngle={Math.PI / 2} // מגביל סיבוב אנכי
/>
{/* ... meshes, lights ... */}
</Canvas>
);
}
Environment — environment map בשורה אחת. ההבדל בין 3D שנראה מזויף ל-3D שנראה אמיתי:
import { Environment } from '@react-three/drei';
// במקום לטעון HDR file, environment map מוכנה:
<Environment preset="sunset" /> // שקיעה חמימה
<Environment preset="city" /> // עיר — שיקופים של בניינים
<Environment preset="studio" /> // סטודיו — תאורה נקייה
<Environment preset="forest" /> // יער — אור ירוק רך
<Environment preset="apartment" /> // דירה — אור פנימי
<Environment preset="dawn" /> // שחר — אור ורוד
Float — אנימציית ריחוף אוטומטית. מושלם ל-hero sections עם אובייקטים צפים:
import { Float } from '@react-three/drei';
// האובייקט צף למעלה ולמטה בצורה אורגנית
<Float
speed={2} // מהירות הריחוף
rotationIntensity={1} // כמה מסתובב
floatIntensity={2} // כמה "גבוה" צף
floatingRange={[-0.1, 0.1]} // טווח התנועה
>
<mesh>
<sphereGeometry args={[1, 32, 32]} />
<meshStandardMaterial color="#6366f1" metalness={0.8} roughness={0.2} />
</mesh>
</Float>
Text3D — טקסט תלת-ממדי עם font ו-material:
import { Text3D, Center } from '@react-three/drei';
// טקסט 3D ממורכז עם material מתכתי
<Center>
<Text3D
font="/fonts/Inter_Bold.json" // צריך typeface.json
size={1}
height={0.2} // עומק הטקסט
bevelEnabled
bevelSize={0.02}
bevelThickness={0.01}
>
Hello 3D
<meshStandardMaterial color="#fbbf24" metalness={0.8} roughness={0.2} />
</Text3D>
</Center>
Sparkles — חלקיקים נוצצים. אפקט מושלם ל-hero backgrounds:
import { Sparkles } from '@react-three/drei';
// חלקיקים זוהרים שרוחפים בסצנה
<Sparkles
count={200} // כמה חלקיקים
size={3} // גודל
speed={0.5} // מהירות תנועה
scale={[10, 10, 10]} // טווח הפיזור
color="#fbbf24" // צבע
/>
עוד קומפוננטות drei שכדאי להכיר:
@react-three/fiber ו-@react-three/dreiקריטריון הצלחה: hero section עם כדורים צפים, חלקיקים נוצצים, environment map, ושליטת מצלמה — הכל ב-30 שורות קוד בערך.
קוביות וכדורים זה נחמד, אבל הכוח האמיתי של 3D באתרים הוא מודלים — מוצרים אמיתיים, דמויות, בניינים, כלי רכב. מודלים תלת-ממדיים נוצרים בכלים כמו Blender, Maya, Cinema 4D, או ZBrush ומיוצאים לפורמט שהדפדפן יכול לטעון.
GLTF — הפורמט הסטנדרטי של 3D באינטרנט:
GLTF (GL Transmission Format) הוא "ה-JPEG של 3D" — הפורמט הסטנדרטי להעברת מודלים תלת-ממדיים באינטרנט. פותח על ידי Khronos Group (אותה קבוצה שפיתחה WebGL ו-OpenGL). שתי וריאנטים:
איפה מוצאים מודלים תלת-ממדיים חינם:
טעינת מודל GLTF ב-React Three Fiber:
// טעינת מודל GLTF עם useGLTF מ-drei
import { Canvas } from '@react-three/fiber';
import { useGLTF, OrbitControls, Environment, Stage } from '@react-three/drei';
function Product({ url }) {
// useGLTF טוען את המודל ועושה cache אוטומטי
const { scene } = useGLTF(url);
return <primitive object={scene} scale={1} />;
}
// preload — טעינה מוקדמת ברקע
useGLTF.preload('/models/laptop.glb');
function ProductShowcase() {
return (
<Canvas camera={{ position: [0, 0, 5], fov: 50 }}>
<Stage environment="city" intensity={0.5}>
<Product url="/models/laptop.glb" />
</Stage>
<OrbitControls
autoRotate
autoRotateSpeed={1}
enableZoom={true}
minDistance={2}
maxDistance={8}
/>
</Canvas>
);
}
שימו לב כמה קוד זה — product viewer שלם עם מודל, תאורה, environment map, צללים, ושליטת מצלמה — ב-20 שורות. זה הכוח של R3F + drei + Stage. הקומפוננטה Stage עוטפת את המודל בתאורת סטודיו, צללי contact, ו-environment map — הכל בשורה אחת.
מודל GLTF לא-אופטימלי יכול להיות 50MB+. המשתמש לא ימתין. כללי אצבע: hero model עד 2MB, product viewer עד 5MB, סצנה מלאה עד 10MB. אם המודל גדול מדי — השתמשו ב-gltf.report לאופטימיזציה, או ב-gltf-transform CLI (Draco compression יכול להקטין 70-90%). סעיף 11.9 מפרט את כל טכניקות הביצועים.
כלים לעבודה עם מודלים:
אם שאלתם אי פעם "למה ה-3D שלי נראה מזויף?" — התשובה כמעט תמיד היא תאורה וחומרים. אותו מודל בדיוק יכול להיראות כמו צעצוע פלסטיק או כמו מוצר מצולם ב-studio מקצועי — ההבדל הוא ב-lighting setup ובפרמטרי ה-material. זה הסעיף הכי חשוב בפרק הזה לאיכות התוצאה.
סוגי אור — מתי משתמשים בכל אחד:
setup תאורה קלאסי — "three-point lighting":
// Three-point lighting — הסטנדרט של צילום סטודיו
function StudioLighting() {
return (
<>
{/* Key light — האור הראשי, חזק, מימין */}
<directionalLight
position={[5, 5, 5]}
intensity={1.5}
castShadow
shadow-mapSize-width={2048}
shadow-mapSize-height={2048}
/>
{/* Fill light — ממלא צללים, חלש, משמאל */}
<directionalLight
position={[-3, 3, 2]}
intensity={0.4}
/>
{/* Back light / rim light — יוצר קונטור, מאחור */}
<pointLight
position={[0, 5, -5]}
intensity={0.6}
/>
{/* Ambient — fill בסיסי שמונע שחור מוחלט */}
<ambientLight intensity={0.2} />
</>
);
}
PBR Materials — חומרים שנראים אמיתיים:
PBR (Physically Based Rendering) הוא שיטת רנדור שמחקה את הפיזיקה של אור. במקום לבחור צבע ולקוות לטוב, מגדירים properties פיזיקליים והמנוע מחשב איך הם נראים. שני הפרמטרים המרכזיים:
// חומרים PBR נפוצים — metalness + roughness
const materials = {
// מתכות
chrome: { metalness: 1, roughness: 0 }, // כרום מלוטש
gold: { metalness: 1, roughness: 0.3, color: '#ffd700' },
brushedSteel: { metalness: 1, roughness: 0.5 }, // פלדה מוברשת
// לא-מתכות
plastic: { metalness: 0, roughness: 0.4 }, // פלסטיק חלק
rubber: { metalness: 0, roughness: 0.9 }, // גומי
glass: { metalness: 0, roughness: 0, transmission: 1, ior: 1.5 }, // זכוכית (MeshPhysicalMaterial)
wood: { metalness: 0, roughness: 0.8 }, // עץ
ceramic: { metalness: 0, roughness: 0.3 }, // קרמיקה
};
Environment Maps — הקסם האמיתי:
environment map (מפת סביבה) היא תמונה פנורמית HDR שעוטפת את הסצנה כולה — כמו שמיים/סביבה שמקיפים את האובייקטים. היא משרתת שני תפקידים: (1) תאורה עקיפה — image-based lighting (IBL) שנותן תאורה ריאליסטית מכל כיוון, (2) שיקופים — אובייקטים מתכתיים וחלקים משקפים את הסביבה. הוספת environment map היא הטריק הבודד שהכי משפר את איכות 3D.
<Environment preset="city" />castShadow על ה-light, receiveShadow על mesh של רצפהקריטריון הצלחה: product viewer שנראה כמו דף e-commerce מקצועי — מודל עם תאורה, צללים, שיקופים, ושליטת מצלמה.
אחד הטריקים הכי מרשימים ב-3D באתרים הוא scroll-driven camera movement — כשהמשתמש גולל, המצלמה זזה בסצנה התלת-ממדית. אתרי product landing pages, סיפורי מותג, ו-storytelling sites משתמשים בזה ליצירת חוויה קולנועית.
שתי גישות עיקריות:
גישה 1: useScroll מ-drei — הדרך הנקייה ביותר ב-R3F. הסצנה נעטפת ב-ScrollControls, ו-useScroll נותן את ההתקדמות (0-1):
// Scroll-driven 3D עם drei ScrollControls
import { Canvas } from '@react-three/fiber';
import { ScrollControls, useScroll, Environment } from '@react-three/drei';
import { useFrame } from '@react-three/fiber';
function ScrollScene() {
const scroll = useScroll();
const meshRef = useRef();
const cameraRef = useRef();
useFrame((state) => {
// scroll.offset = 0 (top) עד 1 (bottom)
const progress = scroll.offset;
// המצלמה זזה בציר Z לפי הגלילה
state.camera.position.z = 10 - progress * 8;
state.camera.position.y = progress * 3;
state.camera.lookAt(0, 0, 0);
// האובייקט מסתובב לפי הגלילה
meshRef.current.rotation.y = progress * Math.PI * 2;
meshRef.current.scale.setScalar(1 + progress * 0.5);
});
return (
<mesh ref={meshRef}>
<torusKnotGeometry args={[1, 0.3, 128, 32]} />
<meshStandardMaterial color="#6366f1" metalness={0.8} roughness={0.2} />
</mesh>
);
}
function App() {
return (
<Canvas camera={{ position: [0, 0, 10] }}>
<ScrollControls pages={3} damping={0.25}>
<ScrollScene />
</ScrollControls>
<Environment preset="city" />
</Canvas>
);
}
גישה 2: GSAP ScrollTrigger + Three.js — כשצריך שליטה מדויקת יותר, או כשהסצנת 3D היא חלק מדף עם תוכן HTML רגיל. בגישה הזו, Three.js Canvas הוא רקע קבוע, ו-GSAP ScrollTrigger שולט במצלמה:
// GSAP ScrollTrigger + Three.js — מצלמה שנשלטת מגלילה
import * as THREE from 'three';
import gsap from 'gsap';
import { ScrollTrigger } from 'gsap/ScrollTrigger';
gsap.registerPlugin(ScrollTrigger);
// יצירת סצנה, מצלמה, רנדרר (כרגיל)
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 100);
const renderer = new THREE.WebGLRenderer({ alpha: true }); // alpha: true = רקע שקוף
// Canvas קבוע ברקע
renderer.domElement.style.position = 'fixed';
renderer.domElement.style.top = '0';
renderer.domElement.style.zIndex = '-1';
document.body.appendChild(renderer.domElement);
// אנימציית מצלמה לפי גלילה
gsap.to(camera.position, {
z: 2,
y: 3,
x: -1,
scrollTrigger: {
trigger: '.content-section',
start: 'top bottom',
end: 'bottom top',
scrub: 1, // החלקה עם הגלילה
}
});
// סיבוב מודל לפי גלילה
gsap.to(model.rotation, {
y: Math.PI * 2,
scrollTrigger: {
trigger: '.product-section',
start: 'top center',
end: 'bottom center',
scrub: true,
}
});
// animation loop
function animate() {
requestAnimationFrame(animate);
renderer.render(scene, camera);
}
animate();
מתי כל גישה:
טיפים ל-scroll-driven 3D:
3D הוא הטכנולוגיה הכי כבדה שנלמדה בקורס הזה. סצנת Three.js פשוטה צורכת יותר משאבים מדף HTML שלם עם כל האנימציות שבו. אם לא מטפלים בביצועים — ה-3D יהפוך מ-wow ל-"למה האתר כל כך איטי?". הנה הטכניקות הקריטיות:
1. Geometry — פחות vertices = יותר מהיר:
<Detailed> מ-drei<Instances> מ-drei מרנדר אלפי copies ב-draw call אחד2. Textures — הרוצח השקט:
3. קבצי GLTF — compression:
gltf-transform optimize model.glb output.glb --compress draco4. Rendering — פחות pixels = יותר מהיר:
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)). מסכי Retina הם 3x — הגבלה ל-2x חוסכת 55% pixelsantialias: true שווה את ההשקעה, אבל על מובייל שקלו לכבות5. Lazy Loading — טעינה חכמה:
// Lazy loading של סצנת 3D — לא טוענים עד שנראה
import { Suspense, lazy } from 'react';
import { Canvas } from '@react-three/fiber';
const Heavy3DScene = lazy(() => import('./Heavy3DScene'));
function Hero() {
const [visible, setVisible] = useState(false);
const ref = useRef();
useEffect(() => {
const observer = new IntersectionObserver(
([entry]) => { if (entry.isIntersecting) setVisible(true); },
{ rootMargin: '200px' } // טוען 200px לפני שנראה
);
observer.observe(ref.current);
return () => observer.disconnect();
}, []);
return (
<div ref={ref} style={{ height: '100vh' }}>
{visible && (
<Suspense fallback={<div className="loading">Loading 3D...</div>}>
<Canvas>
<Heavy3DScene />
</Canvas>
</Suspense>
)}
</div>
);
}
6. Mobile Fallbacks — ה-must שרוב המפתחים שוכחים:
// Mobile fallback — תמונה סטטית במקום 3D
function SmartHero() {
const [isMobile, setIsMobile] = useState(false);
useEffect(() => {
// בדיקה: מסך קטן או GPU חלש
const mobile = window.innerWidth < 768;
const weakGPU = navigator.hardwareConcurrency <= 4;
setIsMobile(mobile || weakGPU);
}, []);
if (isMobile) {
return <img src="/hero-3d-fallback.webp" alt="Product view" />;
}
return (
<Canvas>
{/* ... סצנת 3D מלאה ... */}
</Canvas>
);
}
סיכום ביצועים — מספרים שכדאי לזכור:
renderer.info.render.trianglesdocument.hidden), והפחיתו FPS כש-battery saver mode פעילהנקודה המרכזית: ביצועי 3D הם לא בעיה — אלא אם מתעלמים מהם. כל הטכניקות כאן פשוטות ליישום. הבעיה היא לשכוח ליישם אותן. לכן ה-checklist בסוף הפרק כולל את כל נקודות הביצועים — עברו עליו לפני כל פרסום.
3D מרשים, אבל הוא גם כבד, מורכב ליצירה, ויכול לפגוע בחוויה אם משתמשים בו לא נכון. לפני שמוסיפים 3D — עברו על ה-framework הזה:
| שאלה | כן → 3D שווה | לא → עדיף 2D |
|---|---|---|
| האם המשתמש צריך לראות את המוצר מכל הזוויות? | product viewer מסתובב | 5-6 תמונות סטטיות |
| האם ה-3D מוסיף מידע שלא ניתן להציג ב-2D? | אדריכלות, רפואה, הנדסה | "קוביה מסתובבת כי cool" |
| האם קהל היעד במכשירים חזקים? | desktop, creative pros | מובייל ישן, אפריקה/אסיה |
| האם יש budget לזמן טעינה נוסף? | landing page ייעודי | אתר e-commerce עם אלפי מוצרים |
| האם המתחרים משתמשים ב-3D? | differentiation ברור | 3D לא מעשי בנישה |
| האם אפשר fallback ל-2D? | כן — progressive enhancement | לא — חובה 3D |
כלל הזהב: 3D כ-progressive enhancement, לא כ-requirement. האתר חייב לעבוד בלי 3D. ה-3D מוסיף שכבה — לא מחליף את הבסיס.
תרחישים שבהם 3D שווה את ההשקעה:
תרחישים שבהם 3D כנראה לא שווה:
ב-2026, יותר מ-60% מהתנועה באינטרנט היא ממובייל. מובייל = GPU חלש יותר, סוללה מוגבלת, חיבור איטי יותר. סצנת 3D שרצה ב-60fps על MacBook Pro תרוץ ב-15fps על Samsung A14. תמיד בנו mobile fallback. תמיד בדקו על מכשיר אמיתי (לא רק Chrome DevTools). תמיד שאלו: "מה המשתמש רואה במובייל?"
הדרך הנכונה לחשוב על 3D באתרים: תחשבו עליו כמו וידאו. וידאו באתר מוסיף ערך ענק כשהוא במקום הנכון (hero, product demo, testimonial), אבל הוא כבד, דורש bandwidth, ולא עובד טוב בכל המכשירים. אתם לא שמים וידאו בכל דף — אתם שמים אותו בנקודות אסטרטגיות. אותו דבר עם 3D. אלמנט 3D אחד ממוקם נכון — product viewer בדף מוצר, hero מרשים בדף נחיתה — שווה יותר מעשרה אלמנטים 3D מפוזרים בכל האתר.
ודבר אחרון ב-context של 3D: אל תנסו לעשות הכל לבד. מעצב 3D מקצועי ב-Blender או Cinema 4D ייצור מודל ביום שלכם ייקח שבוע ללמוד. המיומנות שלכם כ-Vibe Coders היא לא ליצור מודלים — היא לשלב מודלים קיימים (Poly.pizza, Sketchfab, Spline) באתר בצורה חכמה ומהירה. השתמשו ב-Spline ליצירת סצנות מגיאומטריות בסיסיות, ב-marketplaces למודלים מורכבים, וב-AI לקוד השילוב.
כלי AI כמו Bolt, Lovable, v0, Cursor ו-Claude כבר יודעים לכתוב קוד Three.js ו-React Three Fiber ברמה מרשימה. אבל התוצאה תלויה באיכות הפרומפט. הנה 5 פרומפטים מוכנים להעתקה:
פרומפט 1: Product Viewer
// פרומפט ל-AI: Product Viewer
"Build a React Three Fiber product viewer component:
- Load a .glb model from /models/product.glb using useGLTF
- OrbitControls with autoRotate (speed 2), zoom enabled (min 2, max 8)
- Environment preset 'studio' for clean reflections
- ContactShadows on the floor (opacity 0.4, blur 2)
- Stage component for presentation lighting
- Suspense with a loading spinner fallback
- The Canvas should be 100% width, 500px height
- Mobile: disable autoRotate, lower pixelRatio to 1"
פרומפט 2: Floating Hero Objects
// פרומפט ל-AI: Hero Section עם אובייקטים צפים
"Create a React Three Fiber hero section (100vh):
- 5 floating geometric shapes: 2 spheres, 1 torus, 1 torus knot, 1 octahedron
- Each wrapped in drei Float with different speed and intensity
- Materials: metallic purple (metalness 0.8, roughness 0.2) with slight color variations
- Environment preset 'city' for reflections
- Sparkles component: 100 gold particles, size 2, speed 0.3
- PresentationControls for subtle drag interaction
- Background: dark gradient (#0a0a0a to #1a1a2e)
- On mobile: reduce to 3 shapes, 50 sparkles"
פרומפט 3: 3D Text Hero
// פרומפט ל-AI: טקסט 3D
"Build a React Three Fiber component with 3D text:
- Text3D from drei, font: Inter Bold (provide typeface.json path)
- Text says 'YOUR BRAND' centered with Center component
- Material: MeshPhysicalMaterial, gold color (#ffd700), metalness 1, roughness 0.2
- Float animation wrapping the text (speed 1.5, rotationIntensity 0.3)
- Environment preset 'sunset' for warm reflections
- Rim lighting: directional light from behind (position [0, 3, -5])
- Subtle particles around the text using Sparkles
- The component should accept text as a prop"
פרומפט 4: Scroll-Driven 3D Scene
// פרומפט ל-AI: סצנת 3D מונעת גלילה
"Create a scroll-driven 3D experience with React Three Fiber:
- Use drei ScrollControls (3 pages, damping 0.25)
- Load a .glb model with useGLTF
- On scroll progress 0-0.33: camera zooms in from z=10 to z=5
- On scroll progress 0.33-0.66: model rotates 360 degrees on Y axis
- On scroll progress 0.66-1: camera orbits to top-down view
- All transitions smooth with useFrame and scroll.offset
- drei Html overlays that appear at specific scroll points
- Environment preset 'city', ambient + directional lighting
- Mobile fallback: static image sequence instead of 3D"
פרומפט 5: Interactive Logo / Mascot
// פרומפט ל-AI: לוגו / מסקוט אינטראקטיבי
"Build an interactive 3D element with React Three Fiber:
- A geometric shape (icosahedron or torus knot) as brand mascot
- MeshDistortMaterial from drei: speed 2, distort 0.3, color gradient
- On hover: increase distortion to 0.6, change color smoothly
- On click: burst of Sparkles from the shape position (temporary, 1 second)
- Subtle Float animation when idle
- The shape 'looks at' the cursor using useFrame + mouse position
- Environment map for reflections
- Small footprint: 300x300px, suitable for navbar or sidebar"
טיפים לפרומפטים טובים יותר ל-3D:
לאורך הפרק הזה למדתם את הכלים. עכשיו בואו נראה איך משתמשים בהם בפרויקטים אמיתיים — 4 תבניות מקצועיות שמכסות את רוב השימושים:
תבנית 1: Product Showcase — e-commerce product viewer
// Product Showcase — תבנית מקצועית מלאה
import { Canvas } from '@react-three/fiber';
import {
useGLTF, OrbitControls, Environment,
ContactShadows, Html, useProgress
} from '@react-three/drei';
import { Suspense } from 'react';
function Loader() {
const { progress } = useProgress();
return <Html center>{progress.toFixed(0)}% loading...</Html>;
}
function Product() {
const { scene } = useGLTF('/models/sneaker.glb');
return (
<primitive
object={scene}
scale={2}
position={[0, -0.5, 0]}
castShadow
/>
);
}
function ProductShowcase() {
return (
<div style={{ width: '100%', height: '500px' }}>
<Canvas
camera={{ position: [0, 1, 5], fov: 50 }}
shadows
dpr={[1, 2]}
>
<Suspense fallback={<Loader />}>
<Product />
</Suspense>
<Environment preset="studio" />
<ContactShadows
position={[0, -0.5, 0]}
opacity={0.5}
blur={2}
far={4}
/>
<OrbitControls
autoRotate
autoRotateSpeed={1}
enableZoom
minDistance={3}
maxDistance={8}
maxPolarAngle={Math.PI / 2}
enablePan={false}
/>
</Canvas>
</div>
);
}
תבנית 2: Hero Background — רקע תלת-ממדי ל-hero section
// Hero Background — אובייקטים צפים ברקע
import { Canvas, useFrame } from '@react-three/fiber';
import {
Float, Sparkles, Environment,
MeshDistortMaterial
} from '@react-three/drei';
import { useRef } from 'react';
function FloatingBlob({ position, color, speed }) {
const meshRef = useRef();
useFrame((state) => {
meshRef.current.rotation.x = state.clock.elapsedTime * 0.1;
});
return (
<Float speed={speed} rotationIntensity={0.5} floatIntensity={1}>
<mesh ref={meshRef} position={position}>
<sphereGeometry args={[1, 32, 32]} />
<MeshDistortMaterial
color={color}
speed={2}
distort={0.3}
metalness={0.8}
roughness={0.2}
/>
</mesh>
</Float>
);
}
function HeroBackground() {
return (
<div style={{ position: 'absolute', inset: 0, zIndex: -1 }}>
<Canvas camera={{ position: [0, 0, 8], fov: 60 }}>
<FloatingBlob position={[-3, 1, 0]} color="#6366f1" speed={1.5} />
<FloatingBlob position={[3, -1, -2]} color="#8b5cf6" speed={2} />
<FloatingBlob position={[0, 2, -3]} color="#a78bfa" speed={1} />
<Sparkles count={100} size={2} speed={0.3} scale={15} color="#fbbf24" />
<Environment preset="city" />
<ambientLight intensity={0.3} />
</Canvas>
</div>
);
}
תבנית 3: Interactive Logo — לוגו או מסקוט שמגיב לעכבר
// Interactive Logo — מגיב ל-hover ולעכבר
import { Canvas, useFrame } from '@react-three/fiber';
import { Float, MeshWobbleMaterial, Environment } from '@react-three/drei';
import { useRef, useState } from 'react';
function InteractiveLogo() {
const meshRef = useRef();
const [hovered, setHovered] = useState(false);
useFrame((state) => {
// הלוגו מסתכל לכיוון העכבר
const { x, y } = state.pointer;
meshRef.current.rotation.x = y * 0.3;
meshRef.current.rotation.y = x * 0.3;
});
return (
<Float speed={hovered ? 3 : 1.5} rotationIntensity={0.3}>
<mesh
ref={meshRef}
onPointerOver={() => setHovered(true)}
onPointerOut={() => setHovered(false)}
scale={hovered ? 1.15 : 1}
>
<icosahedronGeometry args={[1, 1]} />
<MeshWobbleMaterial
color={hovered ? '#ff6b6b' : '#6366f1'}
speed={hovered ? 3 : 1}
factor={hovered ? 0.4 : 0.2}
metalness={0.7}
roughness={0.3}
/>
</mesh>
</Float>
);
}
function LogoSection() {
return (
<div style={{ width: 300, height: 300, cursor: 'pointer' }}>
<Canvas camera={{ position: [0, 0, 3.5] }}>
<InteractiveLogo />
<Environment preset="sunset" />
<ambientLight intensity={0.4} />
</Canvas>
</div>
);
}
תבנית 4: Scroll-Driven Product Reveal — מוצר שנחשף בגלילה
// Scroll-Driven Product Reveal
import { Canvas, useFrame } from '@react-three/fiber';
import {
useGLTF, ScrollControls, useScroll,
Environment, Html
} from '@react-three/drei';
import { useRef } from 'react';
import * as THREE from 'three';
function RevealProduct() {
const { scene } = useGLTF('/models/headphones.glb');
const scroll = useScroll();
const groupRef = useRef();
useFrame((state) => {
const p = scroll.offset; // 0 → 1
// Phase 1 (0-0.3): zoom in
state.camera.position.lerp(
new THREE.Vector3(0, p < 0.3 ? 2 - p * 5 : 0.5, 8 - p * 5),
0.05
);
// Phase 2 (0.3-0.7): rotate product
groupRef.current.rotation.y = THREE.MathUtils.lerp(
0, Math.PI * 2,
Math.max(0, (p - 0.3) / 0.4)
);
// Phase 3 (0.7-1): tilt view
state.camera.position.y = p > 0.7 ? (p - 0.7) * 10 : state.camera.position.y;
state.camera.lookAt(0, 0, 0);
});
return (
<group ref={groupRef}>
<primitive object={scene} scale={2} />
</group>
);
}
function ScrollReveal() {
return (
<Canvas camera={{ position: [0, 2, 8], fov: 50 }} shadows>
<ScrollControls pages={4} damping={0.3}>
<RevealProduct />
<Html position={[3, 2, 0]} distanceFactor={8}>
<h2 style={{ color: 'white' }}>Premium Sound</h2>
</Html>
</ScrollControls>
<Environment preset="city" />
</Canvas>
);
}
קריטריון הצלחה: תבנית 3D עובדת שמשתלבת בדף web, עם fallback למובייל וביצועים סבירים (45+ FPS).
קריטריון הצלחה: סצנת Spline מותאמת אישית עם אינטראקציות, משולבת באתר.
dpr={[1, 2]}| שלב | פעולה | זמן |
|---|---|---|
| 1. החלטה | עברו על framework ה-"מתי 3D" (11.10). האם 3D מוסיף ערך שלא ניתן להשיג אחרת? מהו ה-fallback? | 5 דקות |
| 2. כלי | בחרו כלי: Spline (no-code), R3F + drei (React), Three.js vanilla (non-React). רוב הפעמים: Spline או R3F | 2 דקות |
| 3. Assets | מצאו / צרו מודלים. Poly.pizza / Sketchfab לחינמיים. Spline ליצירה. בדקו גדלים (max 2-5MB) | 15 דקות |
| 4. סצנה | בנו את הסצנה: geometry + materials + lighting + environment. התחילו פשוט ושכללו | 20 דקות |
| 5. אינטראקציות | הוסיפו hover/click/scroll. בדקו שמרגיש טבעי. damping/spring לכל תנועה | 15 דקות |
| 6. Performance | Draco compression, lazy loading, pixel ratio limit, shadow optimization | 10 דקות |
| 7. Fallback | Mobile fallback (image), prefers-reduced-motion, error boundary (מה קורה אם WebGL לא נתמך?) | 10 דקות |
| 8. Test | בדקו ב-3+ דפדפנים, מובייל אמיתי, CPU throttling 4x. תקנו bottlenecks | 15 דקות |
בפרק הזה למדתם 3D באינטרנט — Three.js, Spline, React Three Fiber, מודלים, תאורה, scroll-driven scenes, וביצועים. עכשיו יש לכם את כל הכלים הגדולים: CSS, GSAP, ScrollTrigger, Motion, Lenis, SVG, Lottie, Rive, Canvas, ו-3D. אבל אתר מקצועי לא נבנה רק מה-wow effects — הוא נבנה מהפרטים הקטנים. בפרק 12 תלמדו צלילים ומיקרו-אינטראקציות — הדברים שאתם לא שמים לב אליהם עד שהם חסרים. Hover feedback שמרגיש natural, click ripples, custom cursor שעוקב אחרי העכבר, toggle animations, וצלילי UI עדינים. הפרטים הקטנים שמפרידים בין אתר "יפה" לאתר "מקצועי".