→ פרק קודם: Canvas ומערכות חלקיקים | פרק הבא: צלילים ומיקרו-אינטראקציות ←

פרק 11: 3D באינטרנט — Three.js, Spline ו-React Three Fiber

בפרק 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
מתחיל 6 דקות מושג

11.1 מה זה WebGL ותלת-מימד באינטרנט — ולמה צריך abstractions

כל מה שאתם רואים במסך — כל פיקסל, כל צבע, כל צורה — מצויר על ידי ה-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 ומאפשרות לכם לעבוד ברמה גבוהה יותר:

אתם לא צריכים לכתוב WebGL

בכל הפרק הזה, לא תכתבו שורת WebGL אחת. אתם צריכים להבין שהוא קיים — כי כשמשהו לא עובד, הודעות השגיאה יהיו של WebGL. אבל כל העבודה שלכם תהיה ברמת Three.js, React Three Fiber, או Spline. זה כמו שאתם לא כותבים Assembly כשאתם כותבים JavaScript — אתם עובדים ברמת abstraction גבוהה יותר.

2 דקות עשו עכשיו: ראו את ההבדל
  1. פתחו threejs.org — גללו בדף הראשי ותראו מה אפשר לבנות
  2. פתחו spline.design/examples — שימו לב שכל הסצנות נבנו בלי קוד
  3. פתחו דוגמת React Three Fiber בסיסית — שימו לב כמה הקוד קצר

למה 3D באתרים בכלל? שלוש סיבות מעשיות:

  1. מוצר שצריך להסתובב — נעליים, שעונים, אלקטרוניקה, רהיטים. במקום 20 תמונות סטטיות מזוויות שונות — product viewer אחד שהמשתמש שולט בו. מחקרים מראים עלייה של 40% בזמן שהייה ו-25% יותר conversions
  2. hero section שמרשים — אובייקטים תלת-ממדיים צפים, טקסט 3D, רקע אינטראקטיבי. ההבדל בין "אתר יפה" ל-"אתר שאי אפשר לשכוח"
  3. data visualization ותיאור מורכב — ארכיטקטורה, מוצרים רפואיים, הדמיות מדעיות. דברים שפשוט לא ניתן להסביר ב-2D

ומה שהשתנה ב-2024-2026: הכלים הפכו נגישים. Three.js דורש ידע ב-JavaScript, אבל Spline מאפשר ל-designer ליצור סצנת 3D שלמה בלי שורת קוד. React Three Fiber עם drei מאפשרים product viewer ב-20 שורות. וכלי AI כמו Bolt, Lovable ו-Cursor יודעים לייצר קוד Three.js ו-R3F ברמה מרשימה. 3D באינטרנט כבר לא "רק למפתחים מנוסים".

מתחיל 10 דקות כלי

11.2 Three.js — scene, camera, renderer: שלושת עמודי התלת-מימד

Three.js נוצר ב-2010 על ידי Ricardo Cabello (Mr.doob) ומאז הפך לסטנדרט de facto לתלת-מימד באינטרנט. יותר מ-2.7 מיליון הורדות שבועיות ב-npm, אלפי דוגמאות רשמיות, קהילה ענקית, ותיעוד מצוין. כל מה שאתם רואים ב-3D באינטרנט — כמעט תמיד Three.js מתחת למכסה המנוע.

הרעיון המרכזי של Three.js (ושל כל מנוע 3D) מבוסס על שלושה מרכיבים הכרחיים:

  1. Scene (סצנה) — המרחב התלת-ממדי. חשבו על זה כקופסה ענקית שבתוכה נמצאים כל האובייקטים, האורות, והמצלמות. כל מה שאתם רוצים שייראה — צריך להוסיף ל-scene
  2. Camera (מצלמה) — נקודת המבט. מאיפה הצופה מסתכל על הסצנה? בדרך כלל משתמשים ב-PerspectiveCamera — מצלמה שמחקה עין אנושית (מה שקרוב גדול, מה שרחוק קטן). הפרמטרים: FOV (שדה ראייה, בדרך כלל 75), aspect ratio (יחס רוחב-גובה), near (מה המרחק הקרוב ביותר שנראה), far (מה המרחק הרחוק ביותר)
  3. Renderer (מרנדר) — המנוע שמצייר. לוקח את הסצנה והמצלמה ומייצר תמונה על Canvas. WebGLRenderer הוא הנפוץ ביותר — משתמש ב-GPU לביצועים גבוהים

ואז מוסיפים אובייקטים. כל אובייקט תלת-ממדי ב-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.

5 דקות עשו עכשיו: הקוביה הראשונה שלכם
  1. פתחו CodePen — צרו Pen חדש
  2. ב-Settings → JS → הוסיפו CDN: https://unpkg.com/three@0.170.0/build/three.module.js
  3. העתיקו את הקוד למעלה (שנו את ה-import ל-global THREE שכבר נטען)
  4. שנו את הצבע ב-material — נסו 0xff6b6b (אדום), 0x10b981 (ירוק), 0xfbbf24 (צהוב)
  5. שנו את ה-geometry ל-SphereGeometry(1, 32, 32) — עכשיו זה כדור!
  6. שנו את metalness ל-1 ו-roughness ל-0 — זה נראה כמו כדור מתכת
Framework: Three.js vs Spline vs React Three Fiber — מתי כל אחד
קריטריוןThree.js (Vanilla)SplineReact 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 vizhero sections, product viewers, marketing sitesפרויקטי React עם אלמנטים 3D

כלל אצבע ל-Vibe Coders: התחילו עם Spline. אם Spline לא מספיק — בקשו מ-AI קוד React Three Fiber. Three.js vanilla — רק לפרויקטים שלא ב-React ולא ב-Spline.

3D הוא כבד — תמיד!

גם סצנת 3D פשוטה צורכת יותר GPU ו-CPU מכל אנימציית CSS, GSAP, או Lottie. לפני שמוסיפים 3D — שאלו: "האם התלת-מימד פה מוסיף ערך שלא ניתן להשיג אחרת?" אם product viewer שמסתובב — כן, זה שווה. אם טקסט 3D רק כי "זה נראה cool" — כנראה שלא. סעיף 11.9 מכסה performance בפירוט, אבל הכלל: 3D כמו מלח — קצת משפר, הרבה הורס.

מתחיל 12 דקות כלי

11.3 Spline — תלת-מימד בלי קוד (הכלי הקריטי ל-Vibe Coders)

אם Three.js הוא "כתוב קוד ותקבל 3D", Spline הוא "עצב ויזואלית ותקבל 3D". Spline הוא עורך תלת-ממדי שרץ בדפדפן — לא צריך להתקין כלום. פותחים את spline.design, נרשמים (חשבון חינמי), ומתחילים ליצור. הממשק דומה ל-Figma — שכבות בצד, toolbar למעלה, properties panel בצד השני. אבל במקום עיגולים ומלבנים, יש לכם קוביות, כדורים, טורוסים, ותאורה תלת-ממדית.

למה Spline קריטי ל-Vibe Coders:

הממשק של Spline — מה יש בפנים:

  1. Toolbar (למעלה) — כלי יצירה: Box, Sphere, Cylinder, Torus, Text 3D, Path, ועוד. גם Library של מודלים מוכנים
  2. Viewport (מרכז) — הסצנה התלת-ממדית. גוררים אובייקטים, מסובבים, מזיזים. גלגלת העכבר לזום, right-click drag לסיבוב מצלמה
  3. Layers Panel (שמאל) — כל האובייקטים בסצנה — כמו Layers ב-Figma. אפשר לקבץ, לנעול, להסתיר
  4. Properties Panel (ימין) — מאפייני האובייקט הנבחר: position, rotation, scale, material, physics, interactions
  5. Timeline (למטה) — אנימציות keyframe. מגדירים מצב התחלה ומצב סיום, Spline עושה את המעבר
10 דקות עשו עכשיו: סצנת Spline ראשונה
  1. פתחו spline.design — הירשמו (חינמי) ולחצו "New File"
  2. מה-Toolbar הוסיפו Box (קוביה) — תראו אותה במרכז הסצנה
  3. ב-Properties (ימין) שנו את ה-Material: לחצו על הצבע ובחרו גרדיאנט. שנו Metalness ל-0.8 ו-Roughness ל-0.2
  4. הוסיפו Sphere (כדור) לידה. שנו את ה-material שלה ל-Glass (preset מובנה)
  5. בחרו את הקוביה → Properties → Interactions → הוסיפו "On Hover → Rotate Y 360°". עכשיו העבירו עכבר על הקוביה ב-Play mode
  6. לחצו Export (למעלה ימין) → Embed → העתיקו את ה-iframe code. הדביקו ב-HTML file — יש לכם סצנת 3D באתר!

שיטות ייצוא מ-Spline:

// שילוב 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;
  });
Spline pricing — מה חינם ומה לא

החשבון החינמי מאפשר יצירה מלאה, אבל הייצוא מגיע עם 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 — להשתמש בכלים קיימים ולהתאים, לא לבנות מאפס.

בינוני 10 דקות כלי

11.4 React Three Fiber — Three.js כקומפוננטות React

אם אתם עובדים עם 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>
  );
}

שימו לב למה שקרה כאן:

הקסם של 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 מרגיש כמו חלק טבעי מהאפליקציה, לא כמו עולם נפרד.

5 דקות עשו עכשיו: R3F ב-CodeSandbox
  1. פתחו CodeSandbox — צרו React template חדש
  2. התקינו: npm install @react-three/fiber three
  3. העתיקו את קוד ה-RotatingCube למעלה. שנו את הצבע ל-meshStandardMaterial
  4. הוסיפו onClick ו-onPointerOver כמו בדוגמת ה-InteractiveCube
  5. הוסיפו עוד mesh — כדור ליד הקוביה. שנו לו צבע אחר
בינוני 10 דקות כלי

11.5 drei — ספריית Helper Components שחוסכת מאות שורות

R3F לבד הוא 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 שכדאי להכיר:

15 דקות תרגיל: בנו hero section עם R3F + drei
  1. צרו פרויקט React עם @react-three/fiber ו-@react-three/drei
  2. בנו Canvas שתופס 100vh — זה ה-hero section שלכם
  3. הוסיפו 3 כדורים שצפים עם Float — כל אחד בגודל, צבע ומהירות שונים
  4. הוסיפו Environment preset="city" — שימו לב איך השיקופים משנים את המראה
  5. הוסיפו Sparkles עם צבע זהב — 100 חלקיקים, speed 0.3
  6. הוסיפו OrbitControls עם autoRotate — המשתמש יכול גם לסובב עם העכבר
  7. בונוס: הוסיפו Text3D עם השם שלכם, עטוף ב-Float

קריטריון הצלחה: hero section עם כדורים צפים, חלקיקים נוצצים, environment map, ושליטת מצלמה — הכל ב-30 שורות קוד בערך.

בינוני 8 דקות כלי

11.6 מודלים תלת-ממדיים — GLTF, מקורות חינמיים, וטעינה באתר

קוביות וכדורים זה נחמד, אבל הכוח האמיתי של 3D באתרים הוא מודלים — מוצרים אמיתיים, דמויות, בניינים, כלי רכב. מודלים תלת-ממדיים נוצרים בכלים כמו Blender, Maya, Cinema 4D, או ZBrush ומיוצאים לפורמט שהדפדפן יכול לטעון.

GLTF — הפורמט הסטנדרטי של 3D באינטרנט:

GLTF (GL Transmission Format) הוא "ה-JPEG של 3D" — הפורמט הסטנדרטי להעברת מודלים תלת-ממדיים באינטרנט. פותח על ידי Khronos Group (אותה קבוצה שפיתחה WebGL ו-OpenGL). שתי וריאנטים:

איפה מוצאים מודלים תלת-ממדיים חינם:

3 דקות עשו עכשיו: הורידו מודל GLTF
  1. פתחו poly.pizza — חפשו "laptop" או "phone" או כל מוצר שמעניין אתכם
  2. בחרו מודל שמוצא חן בעיניכם — לחצו Download → GLB format
  3. שימו לב לגודל הקובץ. מודל טוב לאתר: מתחת ל-2MB. אם יותר — צריך אופטימיזציה

טעינת מודל 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 מפרט את כל טכניקות הביצועים.

כלים לעבודה עם מודלים:

בינוני 10 דקות טכניקה

11.7 תאורה וחומרים — ההבדל בין 3D חובבני למקצועי

אם שאלתם אי פעם "למה ה-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.

5 דקות עשו עכשיו: נסו environment presets
  1. אם יש לכם סצנת R3F פתוחה — הוסיפו <Environment preset="city" />
  2. החליפו ל-"sunset", "studio", "forest", "apartment", "dawn" — שימו לב איך כל אחד משנה לחלוטין את האווירה
  3. עם כדור כרום (metalness=1, roughness=0) — ההבדל דרמטי ביותר. בלי environment map — הכדור שחור. עם — הוא מלא שיקופים
  4. ב-Spline: Properties → Environment → בחרו מתוך ה-presets. אותו אפקט, בלי קוד
20 דקות תרגיל: בנו product viewer מקצועי
  1. הורידו מודל GLB מ-poly.pizza (בחרו מוצר — headphones, sneaker, watch)
  2. בנו קומפוננטת R3F עם useGLTF, OrbitControls, ו-Environment
  3. הוסיפו three-point lighting כמו הדוגמה למעלה
  4. הפעילו צללים: castShadow על ה-light, receiveShadow על mesh של רצפה
  5. הוסיפו ContactShadows מ-drei — צללים רכים על הרצפה
  6. התנסו עם environment presets שונים — בחרו את זה שנותן את המראה הכי טוב למוצר שלכם
  7. בונוס: הוסיפו autoRotate ל-OrbitControls ו-Html tag שמציג את שם המוצר ליד המודל

קריטריון הצלחה: product viewer שנראה כמו דף e-commerce מקצועי — מודל עם תאורה, צללים, שיקופים, ושליטת מצלמה.

מתקדם 10 דקות טכניקה

11.8 3D + גלילה — תנועת מצלמה מונעת scroll

אחד הטריקים הכי מרשימים ב-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();
3 דקות עשו עכשיו: ראו scroll-driven 3D בפעולה
  1. פתחו threejs-journey.com — שימו לב איך הסצנה מגיבה לגלילה
  2. פתחו apple.com/airpods-pro — גללו לאט ותראו את המוצר מסתובב עם הגלילה
  3. שימו לב: בשני המקרים, המצלמה נעה חלק — אין קפיצות. זו תוצאה של scrub + easing

מתי כל גישה:

טיפים ל-scroll-driven 3D:

מתקדם 8 דקות ביצועים

11.9 ביצועים — איך ש-3D לא יהרוג את האתר

3D הוא הטכנולוגיה הכי כבדה שנלמדה בקורס הזה. סצנת Three.js פשוטה צורכת יותר משאבים מדף HTML שלם עם כל האנימציות שבו. אם לא מטפלים בביצועים — ה-3D יהפוך מ-wow ל-"למה האתר כל כך איטי?". הנה הטכניקות הקריטיות:

1. Geometry — פחות vertices = יותר מהיר:

2. Textures — הרוצח השקט:

3. קבצי GLTF — compression:

4. Rendering — פחות pixels = יותר מהיר:

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>
  );
}
3 דקות עשו עכשיו: בדקו ביצועי 3D
  1. פתחו Chrome DevTools → Performance tab → לחצו Record → גללו בדף עם 3D → עצרו
  2. חפשו את ה-GPU section — בדקו כמה זמן frame לוקח. מעל 16ms = מתחת ל-60fps
  3. פתחו DevTools → Rendering → סמנו "FPS meter" — תראו את ה-FPS בזמן אמת
  4. נסו עם CPU throttling 4x — ככה זה מרגיש על מובייל ישן

סיכום ביצועים — מספרים שכדאי לזכור:

הנקודה המרכזית: ביצועי 3D הם לא בעיה — אלא אם מתעלמים מהם. כל הטכניקות כאן פשוטות ליישום. הבעיה היא לשכוח ליישם אותן. לכן ה-checklist בסוף הפרק כולל את כל נקודות הביצועים — עברו עליו לפני כל פרסום.

מתחיל 6 דקות החלטה

11.10 מתי להשתמש ב-3D — framework החלטה

3D מרשים, אבל הוא גם כבד, מורכב ליצירה, ויכול לפגוע בחוויה אם משתמשים בו לא נכון. לפני שמוסיפים 3D — עברו על ה-framework הזה:

Framework: האם צריך 3D?
שאלהכן → 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 לקוד השילוב.

מתחיל 6 דקות AI

11.11 חמישה פרומפטים AI ל-3D באתרים

כלי 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:

5 דקות עשו עכשיו: נסו פרומפט אחד
  1. בחרו את הפרומפט שהכי מתאים לפרויקט שלכם
  2. העתיקו אותו ל-Bolt, Lovable, v0, או Cursor
  3. התאימו את הפרטים: צבעים, גדלים, שם טקסט, URL של מודל
  4. שימו לב לתוצאה — AI בדרך כלל מייצר קוד R3F עובד מהפעם הראשונה, אבל ייתכן שצריך לתקן lighting או proportions
מתקדם 8 דקות תבנית

11.12 תבניות מקצועיות — 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>
  );
}
25 דקות תרגיל: בנו דף עם אחת מהתבניות
  1. בחרו תבנית אחת מהארבע שלמעלה — מה שהכי מתאים לפרויקט שלכם
  2. בנו את התבנית ב-CodeSandbox או ב-Lovable/Bolt (עם הפרומפטים מ-11.11)
  3. התאימו צבעים, מודל, ותאורה לפרויקט שלכם
  4. בדקו שזה עובד ב-Chrome, Firefox, ו-Safari
  5. הוסיפו mobile fallback: אם מסך קטן מ-768px — מציגים תמונה סטטית במקום 3D
  6. בדקו ביצועים: DevTools → Performance → ה-FPS צריך להיות 45+ בממוצע
  7. בונוס: שלבו את התבנית בפרויקט אמיתי שלכם — hero section, about page, או product page

קריטריון הצלחה: תבנית 3D עובדת שמשתלבת בדף web, עם fallback למובייל וביצועים סבירים (45+ FPS).

15 דקות תרגיל: סצנת Spline מלאה
  1. פתחו Spline ובחרו סצנה מ-community.spline.design — עשו לה Remix
  2. שנו את הצבעים והחומרים כך שיתאימו לסגנון שלכם
  3. הוסיפו אינטראקציה: hover שמגדיל אובייקט + click שמשנה צבע
  4. ייצאו כ-React component או כ-iframe embed
  5. שלבו בדף HTML — ודאו שה-iframe responsive (width: 100%, height מתאים)

קריטריון הצלחה: סצנת Spline מותאמת אישית עם אינטראקציות, משולבת באתר.

צ'קליסט — לפני שמפרסמים 3D באתר
שגרת עבודה: הוספת 3D לפרויקט
שלבפעולהזמן
1. החלטהעברו על framework ה-"מתי 3D" (11.10). האם 3D מוסיף ערך שלא ניתן להשיג אחרת? מהו ה-fallback?5 דקות
2. כליבחרו כלי: Spline (no-code), R3F + drei (React), Three.js vanilla (non-React). רוב הפעמים: Spline או R3F2 דקות
3. Assetsמצאו / צרו מודלים. Poly.pizza / Sketchfab לחינמיים. Spline ליצירה. בדקו גדלים (max 2-5MB)15 דקות
4. סצנהבנו את הסצנה: geometry + materials + lighting + environment. התחילו פשוט ושכללו20 דקות
5. אינטראקציותהוסיפו hover/click/scroll. בדקו שמרגיש טבעי. damping/spring לכל תנועה15 דקות
6. PerformanceDraco compression, lazy loading, pixel ratio limit, shadow optimization10 דקות
7. FallbackMobile fallback (image), prefers-reduced-motion, error boundary (מה קורה אם WebGL לא נתמך?)10 דקות
8. Testבדקו ב-3+ דפדפנים, מובייל אמיתי, CPU throttling 4x. תקנו bottlenecks15 דקות
בדקו את עצמכם — מה למדתם בפרק
סיכום הפרק
מה בפרק הבא

בפרק הזה למדתם 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 עדינים. הפרטים הקטנים שמפרידים בין אתר "יפה" לאתר "מקצועי".

→ פרק קודם: Canvas ומערכות חלקיקים | פרק הבא: צלילים ומיקרו-אינטראקציות ←