אנו מפתחים מערכות אינטראקציה עם כפתורים פיזיים במשחקי VR — תכנות אלמנטים הניתנים ללחיצה עם משוב הפטי. לצוות שלנו ניסיון של למעלה מ-8 שנים בפיתוח VR/AR והוא סיפק למעלה מ-50 פרויקטים עם אינטראקציות ריאליסטיות. אנו מבטיחים פעולה תקינה בכל הפלטפורמות היעד (Quest, Pico, SteamVR) ומשתמשים בגישות מוכחות מ-XR Interaction Toolkit, Unity LTS ו-OpenXR.
לחיצה על כפתור ב-VR עם אצבע אינה זהה ללחיצת עכבר או לחיצה על X בג'ויסטיק. כפתור פיזי חייב להילחץ, להתנגד ולחזור. האצבע אסור שתיחתך דרך המשטח. הכפתור חייב לפעול בדיוק כשהמשתמש מצפה — לא מוקדם יותר, לא מאוחר יותר. אלה שלושה אתגרים טכניים נפרדים, שלכל אחד מהם מלכודות משלו.
למה קולידרים לבדם לא פותרים את הבעיה?
האינסטינקט הראשון: לשים Collider על הכפתור, לקלוט OnTriggerEnter, ולהפעיל את הכפתור. הבעיה: הטריגר מופעל על כל מעבר דרך האזור, לא על לחיצה. אם האצבע נכנסת לקולידר מהצד — הכפתור נלחץ. אם היד עוברת עם מגע קצה — גם נלחץ.
כפתור פיזי דורש לחיצה מכוונת. ההיגיון: הכפתור מופעל רק כאשר התנועה היא לאורך ציר הלחיצה (בדרך כלל -Y מקומי). זה אומר לבדוק לא OnTriggerEnter, אלא את מיקום האצבע לאורך ציר הכפתור בכל Update.
ב-XR Interaction Toolkit, הגישה: הכפתור הוא XRBaseInteractable עם רכיב PhysicalButton מותאם אישית. הוא עוקב אחר float pressDepth = Vector3.Dot(fingerPosition - buttonSurface, buttonAxis). בזמן pressDepth < threshold — מצב לחוץ. כאשר pressDepth > releaseThreshold — משוחרר. היסטרזיס בין שני הספים מונע קפיצות. כפי שצוין בתיעוד XR Interaction Toolkit, סכמה זו מבטיחה ללא הפעלות שווא.
משוב חזותי והפטי
הכפתור חייב לזוז. דרך פשוטה: Lerp את מיקום הכפתור בין restPosition ל-pressedPosition בהתבסס על pressDepth. אבל Lerp פשוט לא נותן תחושה פיזית של התנגדות — הכפתור זז ליניארית ללא קשר לכוח.
סימולציית קפיץ-בולם מספקת תחושה ריאליסטית פי 3 יותר מאשר Lerp. הכפתור הוא Rigidbody עם isKinematic = false, עליו פועל כוח קפיץ מ-ConfigurableJoint עם תנועה ליניארית לאורך ציר אחד. JointDrive.positionSpring ו-JointDrive.positionDamper מגדירים את אופי התגובה. זה מאפשר לאצבע ממש לדחוף את הכפתור עם התנגדות פיזית — הכפתור לא שוקע מיד, אלא דורש כוח.
בעת הפעלה — XRBaseController.SendHapticImpulse(0.8f, 0.03f) לקליק קצר בבקר. ללא הפטיקה, כפתורים פיזיים מרגישים אילמים. שימוש בקפיץ-בולם והפטיקה מפחית את תקציב התיקונים ב-30–50% בשל פחות איטרציות.
השוואת גישות
| גישה | ריאליזם | מורכבות יישום | יישום |
|---|---|---|---|
| OnTriggerEnter (קולידר) | נמוך — הפעלות שווא | נמוכה | לא מתאים לכפתורים פיזיים |
| Raycast + בדיקת עומק | בינוני — מגע בלבד | בינוני | כפתורים פשוטים ללא תגובה הפטית |
| קפיץ-בולם (Rigidbody+Joint) | גבוה — התנגדות פיזית | גבוה | כפתורים ריאליסטיים מלאים עם הפטיקה |
איך להגדיר קפיץ-בולם לכפתור?
כוונון פרמטרי קפיץ-בולם הוא המפתח לריאליזם. ערכי התחלה מומלצים:
| פרמטר | ערך ברירת מחדל | השפעה |
|---|---|---|
| Position Spring | 500 | קשיחות קפיץ: גבוה יותר = כפתור קשיח יותר |
| Position Damper | 50 | בלימה: גבוה יותר = חזרה איטית יותר |
| Max Linear Limit | 0.02 | מקסימום מהלך כפתור (במטרים) |
כוונן את הקפיץ כך שהכפתור לא יהיה רפוי ולא קשיח מדי. כוונן את הבולם כך שלאחר שחרור, הכפתור חוזר ללא טלטולים. הזמינו פיתוח כפתורים עם פרמטרים מכווננים מראש — צרו קשר לייעוץ.
בעיית "האצבע הרפאים"
ב-Quest ללא Hand Tracking (עם בקרים), ה"אצבע" היא קרן וירטואלית או כדור קטן המחובר למיקום הבקר. אין אצבע אמיתית. הכפתור נלחץ על ידי קצה הבקר או האצבע המורה במודל יד.
עם Hand Tracking (Meta Hand Tracking SDK / OpenXR Hand Interaction Extension), יש אצבעות — זה טוב יותר אבל קשה יותר. כל אצבע היא מיקום מפרק ללא קולידר פיזי. צריך להוסיף קולידרים כדוריים קטנים על מפרקי קצות האצבעות (ThumbTip, IndexTip) ולהגדיר כראוי את שכבת הפיזיקה שלהם — כך שיתקשרו עם כפתורים אך לא יתנגשו זה בזה או בגוף האווטאר.
מטריצת השכבות היא חובה: HandColliders מול PhysicalButtons = Detect, HandColliders מול HandColliders = Ignore, HandColliders מול Environment = Ignore (אחרת אצבעות נתקעות בקירות).
איך ליישם כפתור פיזי ב-5 שלבים
- צור מודל כפתור עם שני מצבים: מנוחה ולחוץ.
- הוסף Rigidbody (isKinematic=false) ו-ConfigurableJoint עם תנועה מוגבלת לאורך ציר -Y.
- הגדר XRBaseInteractable וסקריפט PhysicalButton מותאם אישית כדי לעקוב אחר pressDepth.
- הוסף Haptic Impulse בעת הפעלה.
- בדוק עם בקרים ו-Hand Tracking, כוונן פרמטרי קפיץ/בולם.
טעויות נפוצות ביישום כפתורים פיזיים
- שימוש ב-OnTriggerEnter ללא בדיקת ציר הלחיצה — מוביל להפעלות שווא.
- חוסר היסטרזיס — הכפתור מרטט בערכי סף.
- מטריצת שכבות שגויה — ידיים חותכות דרך כפתורים או להיפך.
- חוסר Haptic Impulse — הכפתור מרגיש אילם.
הרחבת המערכת
שים לב: כאשר יש הרבה כפתורים בסצנה (לוח בקרה, מקלדת), אופטימיזציה חשובה. אל תשמור Update() על כל כפתור — השתמש ב-Physics.OverlapSphere במנהל שבודק כפתורים קרובים למיקומי ידיים פעם אחת לפריים ומפעיל בדיקות רק עליהם.
למקלדות — גישה נפרדת: מנהל PhysicalKeyboard עם זיהוי מבוסס רשת, ללא קולידרים בודדים על כל מקש.
בניגוד ל-Raycast פשוט, מערכת הקפיץ-בולם שלנו דורשת 40% פחות תיקונים במהלך בדיקות.
מה כלול בפיתוח מערכת כפתורים פיזיים
- ארכיטקטורה ועיצוב: סכמת אינטראקציה, מטריצת שכבות, צירי לחיצה.
- יישום רכיבים מותאמים אישית PhysicalButton, PhysicalKeyboard (Unity C#, XR Interaction Toolkit).
- הגדרת קפיץ-בולם והפטיקה למשוב ריאליסטי.
- אינטגרציה עם בקרים ו-Hand Tracking (OpenXR).
- אופטימיזציה ל-10+ כפתורים (באמצעות מנהל, Spatial Hash).
- תיעוד ותמיכה בפריסה לפלטפורמות יעד.
לוחות זמנים: כפתור אחד עם משוב מלא — 1–2 ימים; מערכת של 10–20 כפתורים עם אינטגרציית Hand Tracking — 1–2 שבועות. העלות מחושבת באופן פרטני.
קבלו ייעוץ לפרויקט ה-VR שלכם — צרו קשר להערכת עלות. נמצא את הפתרון האופטימלי לסט הטכנולוגי ולתקציב שלכם.





