---
name: boneh-dgamim-3d
description: "בונה דגם תלת־ממד מפורט של חפץ אמיתי (מכונית, טנק, מטוס, ספינה, מכונה, מבנה) בקוד בלבד ב־Three.js, בלי קבצי מודל ובלי תמונות. מפרק את החפץ למערכות, מכלולים וחלקים עד הבורג, האטם והתפר, עם שם והסבר בעברית לכל חלק, פירוק, חתך, רנטגן, מבטים וחלקים נעים. הפעל כשמבקשים ״תבנה בתלת־ממד״, ״דגם מפורט של…״, ״עד הפרטים הכי קטנים״, ״לרזולוציות הכי קטנות״, ״הדגם הבא בספרייה״, ״ספריית התלת־ממד היומית״, כשממשיכים או משפרים את daily-3d-library, או כשהריצה היומית מתחילה. לא מתאים למשחק שלם (השתמש ב־threejs-game-director) או ליצירת מודל בעזרת AI חיצוני (threejs-3d-generator)."
---

# בונה דגמי תלת־ממד, עד הבורג האחרון

הסקיל הזה נולד מבניית #001 בספריית התלת־ממד היומית: ״החיה״, רכב השרד של נשיא ארה״ב. הדגם כולל 246 חלקים, ובכל אחד מהם מכלולים ופרטים זעירים. הסקיל מתאר את השיטה שעבדה, את הטעויות שעלו בזמן אמת ואת המקום להשתפר. **המטרה בכל דגם חדש היא לעלות רמה על הקודם, לא רק לשכפל אותו.**

## עיקרון העל: מלמעלה למטה, ארבע רמות

כל חפץ נבנה ב־4 רמות, וכל רמה חייבת להופיע בדגם:

1. **מערכות** (8–12): למשל מרכב, דלתות, זכוכית, תאורה, גלגלים, מתלים, שלדה, מנוע, פנים, שריון ומערכות מיוחדות. לכל מערכת יש צבע, תיאור והתנהגות בפירוק.
2. **מכלולים**: גלגל, דלת, מושב, ראש מנוע וכדומה. כל מכלול הוא `part` עם שם, חומר והסבר.
3. **חלקים**: צמיג, חישוק, אומים, דיסק בלם, קליפר.
4. **פרטים זעירים**: הם מה שהופך את הדגם ל״אמיתי״. ברגים ואומים, מסמרות, אטמים, צינורות וחוטים, תפרים, כיתוב (על צמיגים, מנועים ולוחיות), פנימיות של פנסים (נורות LED, מחזירי אור, עדשות), כפתורים עם כיתוב מואר, ושכבות פנימיות שנראות בחתך (שריון, בוכנות, טבעת ראן־פלאט).

רשימות בדיקה לפי סוג החפץ (מכונית, טנק, מטוס, ספינה, מבנה, מכונה) נמצאות ב־`references/anatomy-checklists.md`. **קרא אותן לפני שאתה מתחיל לבנות.**

## זרימת העבודה

1. **מחקר קצר (15–20 דקות):** מידות אמיתיות (אורך, רוחב, גובה, בסיס גלגלים), מנגנונים, חומרים, סמלים וכיתובים. רשום מקורות. נתון שלא ידוע או מסווג מקבל הערכה הנדסית מוצהרת (`specNote`).
2. **תוכנית אנטומיה:** טבלת מערכות → מכלולים → פרטים, עם יעד של לפחות 150 חלקים בעלי שם. בדוק אם בתור (`queue.json`) יש `note` עם בקשות המשתמש למודל הזה.
3. **מעטפת:** פונקציות חתך `S(x, v)` ו־`surface()` לגוף ולגג. דלתות, מכסים וחלונות הם טלאים שנחתכים מאותו משטח, עם נקודות שבירה משותפות, כך שהחורים מתאימים בדיוק.
4. **חלקים נעים:** `K.toggle` לכל מה שנפתח, מסתובב או נדלק. בטנק למשל: צריח, תותח, צוהרים וזחלים.
5. **פנים:** מושבים מפוסלים, לוחות כפתורים, מסכים וחגורות, תוך שמירה על מרחב לאדם.
6. **פרטים זעירים:** עבור על רשימת הבדיקה של הסוג וסמן כל שורה.
7. **חומרים ותאורה:** מתוך הקטלוג `M.*`, עם סטודיו כהה שכבר נמצא ב־viewer.
8. **בדיקה (QA):** לפי הפרק ״בדיקה מנקודת המבט של אדם״ למטה. אסור לדלג על השלב הזה.
9. **פרסום:** `python3 build.py --check`, עדכון README, ויקי ו־catalog, קומיט ומיזוג, ושליחת הקובץ למשתמש.

## ארגז הכלים (`daily-3d-library/engine/kit.js`)

| צריך | כלי |
|---|---|
| חלק עם שם (מופיע ברשימה, בריחוף ובפירוק) | `part(parent, { he, en, mat, desc })`. חלקים מקוננים יוצרים מכלולים |
| גוף, פחים, משטחים מעוגלים | `surface(S, xs, vs, { skip, out, offset, thickness })` ו־`samples(a, b, step, breaks)` |
| צורה אורגנית (ריפוד, כרית, בית מראה, ידית, כיסוי) | `G.soft(w, h, d, { r, seg, deform(p, n) })`: קופסה מעוגלת שמפסלים בקואורדינטות מנורמלות |
| עור מקופל עם תפרים וחירור | `M.quilted(color, 'u'/'v', thread, pleats)` על הפאה הנכונה בלבד (מערך של 6 חומרים) |
| כפתורים, ידיות סיבוב, מתגים מוגנים | `K.panel(parent, { pos, normal, up, w, h, buttons:[{ x, y, kind, label, led }] })` |
| הרבה חלקים זהים (מסמרות, אריחים, חריצים) | `instances(geo, mat, list)` (קריאת ציור אחת) |
| כיתוב ומדבקות | `K.textTexture`, `K.canvasTexture`, `M.decal` |
| חלקים נעים ואנימציה | `K.toggle(id, { he, key, night }, fn)`, `K.onFrame(fn)` |
| פירוק מקומי של תת־חלק | `obj.userData.explodeLocal = V3(...)` |
| חלק ששייך למערכת אחרת (למשל שריון בתוך דלת) | `obj.userData.sysOverride = 'armor'` |

## כללי איכות (כל אחד מהם נלמד מטעות אמיתית)

- **אסור שיהיו קופסאות פשוטות בדברים שיושבים עליהם או נוגעים בהם.** המשתמש פסל מושבים ״גיאומטריים״. ריפוד נבנה עם `G.soft` ועם `M.quilted`: כריות צד, תמיכה לגב התחתון, שקיעה במרכז, קפלים ותפר כפול.
- **תא נהג בלי כפתורים נראה לא גמור.** בכל מקום שאדם נוגע בו צריך `K.panel` עם כיתוב: הגה, לוח מחוונים, ידית דלת, צד מושב, תקרה, קונסולה.
- **מרווחים בין חלקים שפונים זה לזה.** ההגה נכנס פעם למושב. השאר מקום לאדם: לפחות 4 ס״מ, ובדוק אותו בצילום חתך.
- **שום דבר לא מרחף.** סמל שטוח מעל כיפה מעוגלת נראה תלוי באוויר. הנח סמל על משטח שטוח או בתוך מסגרת, וסגור פרופיל lathe עד רדיוס 0. צנרת עוברת מאחורי חיפוי ולא באמצע החלל.
- **שום דבר לא חודר.** מאוורר חדר פעם דרך מכסה המנוע, ומשענות ראש דרך החלון האחורי. בדוק כל רכיב גבוה מול המעטפת.
- **בלי ״דליפה״ של שכבות (z-fighting).** שכבות שקרובות ביותר מ־8 מ״מ זו לזו מהבהבות דרך הצבע. שמור מרווח, ומישור קרוב של המצלמה (near) ≥ 0.05.
- **כיתוב לא הפוך ולא במראה.** לצד ימין ולצד שמאל בונים עם פרמטר `s = ±1` או עם סיבוב ב־180°, ולא עם קנה מידה שלילי. כיתוב על משטח נטוי מכוונים עם `makeBasis`.
- **`G.extrude` עם bevel מגדיל את קו המתאר.** השתמש ב־`bevelOffset: -bevel` כשחלקים אחרים ממוקמים צמוד לקו המתאר הזה (לוח המחוונים ״קבר״ פעם את המסכים שלו).
- **צבע כהה דורש סטודיו כהה.** סביבת חדר בהירה הפכה פעם את השחור ללבן.
- **אור שנדלק צריך חומר משלו**, ולא חומר מהמטמון של `M.*`, אחרת כל מה שמשתף את החומר נדלק יחד.
- **תקציב:** עד 700 אלף משולשים ועד 1,500 רשתות. כל קופסה מעוגלת עולה כ־600 משולשים, ולכן לחלקים שחוזרים עשרות פעמים משתמשים ב־`BoxGeometry` או ב־`instances`. כשהמספרים עולים, הפעל סקריפט שמראה איזה חלק ״אוכל״ הכי הרבה משולשים.

## בדיקה מנקודת המבט של אדם

מבט כללי לא מספיק. כל הבעיות שהמשתמש מצא היו בתקריב. לכל דגם:

1. `node tools/check.cjs --qa <id>` מייצר צילומים מכל הכיוונים, בפירוק, ברנטגן, בחתך, במצב פתוח ובלילה, ומכל המבטים שהוגדרו. **קרא כל צילום בעצמך.**
2. צלם מנקודות עין: מושב הנהג או המפקד, תא הנוסעים, תקריב של גלגל או זחל, תקריב של לוח מכשירים, וחתך דרך תא האדם. השתמש בסקריפט צילום מותאם עם מצלמה ספציפית.
3. רשימת בדיקה:
   - האם משהו חודר למשהו אחר?
   - האם משהו מרחף?
   - האם יש קופסה ״חשופה״?
   - האם חסרים כפתורים או מחברים?
   - האם הכיתוב הפוך?
   - האם יש הבהוב בין שכבות?
   - האם הממשק עובד במובייל ברוחב 390 פיקסלים?
4. **השוואה לתמונות אמיתיות, חלק אחר חלק (חובה בכל דגם):** מורידים תמונות של החפץ האמיתי מוויקישיתוף (`tools/refs.py fetch`), מצלמים את הדגם מאותן זוויות (`tools/shot.cjs`) ומעמידים זה לצד זה (`tools/refs.py pair`). עוברים לפי הסדר: צללית ופרופורציות, מסות גדולות, כל מערכת בנפרד, ובסוף צבע וחומרים. מתקנים ומצלמים שוב עד שאין חלק שנראה שונה. את התמונות לא שומרים במאגר; רושמים ב־README מול אילו קבצים השווינו. פירוט ב־BUILD_GUIDE §6b.
5. רק אחרי שהכול נקי מפרסמים.

## סביבת הענן (Claude Code בענן)

- Chromium בלי מסך לא סומך על תעודת ה־proxy. `check.cjs` מנתב קבצי CDN דרך `curl` ושומר אותם במטמון. **לעולם אל תבטל אימות TLS.**
- SwiftShader (רינדור בלי מעבד גרפי) איטי. במצב `?shot=1` אין לולאת רינדור, והבדיקה קוראת ל־`__render()` פעם אחת לכל צילום.
- ריצה יומית שמתחילה בלי המאגר: מצרפים אותו עם `add_repo`, ומפרסמים ל־`main` עם בקשת מיזוג (PR) שמתמזגת אוטומטית.

## שיחה עם המשתמש

- **תמיד בעברית**, גם השאלות וגם האפשרויות בתפריט.
- מראים התקדמות במשפט קצר כל כמה דקות.
- בסוף שולחים את קובץ ה־HTML (`SendUserFile`), ומבקשים משוב דווקא על תקריבים.

## פתח לשיפור: איך הדגם הבא יהיה טוב יותר

הדגם הראשון הוא נקודת התחלה ולא תקרה. בכל דגם חדש בחר לפחות **שני שיפורים** מתוך `references/next-level.md` ויישם אותם: חומרים עם בלאי ולכלוך, אנימציות של מנגנונים, תאורה קולנועית, סיור מודרך, זום שחושף פרטים זעירים ועוד. אם השיפור שימושי לכל הדגמים, הכנס אותו ל־`engine/` ותעד אותו כאן.

## קבצים

- `references/anatomy-checklists.md`: מה חייב להופיע בכל סוג חפץ.
- `references/next-level.md`: רעיונות לשיפור האיכות, מסודרים לפי השפעה.
- הספרייה עצמה: `daily-3d-library/` (`BUILD_GUIDE.md`, `engine/`, `models/001-…` כדוגמת ייחוס).
