אנו משלבים שחזור סצנה (Scene Reconstruction) באפליקציות AR כאשר נדרשת אינטראקציה מדויקת עם הסביבה האמיתית. ללא LiDAR במכשירים (iPhone 12 Pro וחדשים יותר, iPad Pro 2020+) שחזור סצנה אינו אפשרי—זמין רק זיהוי מישורים. בעיה אופיינית: לאחר שילוב ARKit עם sceneReconstruction = .mesh, האפליקציה מתחילה לגמגם מכיוון שכל קודקוד רשת נוצר מחדש בכל פריים. אנו פותרים זאת על ידי עבודה ישירה עם באפרים של Metal ועדכון רק של עוגנים שהשתנו. בפרויקט מחסן אחד, עיבדנו עד 30,000 קודקודים לפריים תוך שמירה על 60 FPS. בואו נצלול לפרטים הטכניים.
איך עובד שחזור סצנה?
ARMeshAnchor צובר את גיאומטריית החדר בזמן אמת. ARMeshGeometry מאחסן קודקודים, נורמלים ואינדקסי משולשים. עדכונים מגיעים דרך ה-delegate session(_:didUpdate:)—בכל פריים ARKit יכול לשלוח עשרות עוגנים מעודכנים. יישום נאיבי שיוצר מחדש MeshResource בכל עדכון הורג את ה-thread הראשי תוך שניות. הגישה הנכונה: עדכון הרשת רק עבור עוגנים שהשתנו, שימוש ב-MDLMesh כפורמט ביניים, והעברת נתונים ישירות לבאפרים של Metal.
ב-RealityKit זה נראה כך:
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
for anchor in anchors.compactMap({ $0 as? ARMeshAnchor }) {
updateMeshVisualization(for: anchor)
}
}
func updateMeshVisualization(for anchor: ARMeshAnchor) {
let geometry = anchor.geometry
// Работаем с geometry.vertices, geometry.faces напрямую
// Не создаём новый MeshResource каждый раз — патчим существующий
} למה סיווג משטחים קריטי עבור AR?
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) { for anchor in anchors.compactMap({ $0 as? ARMeshAnchor }) { updateMeshVisualization(for: anchor) } } func updateMeshVisualization(for anchor: ARMeshAnchor) { let geometry = anchor.geometry // Работаем с geometry.vertices, geometry.faces напрямую // Не создаём новый MeshResource каждый раз — патчим существующий } מספק סוגים: רצפה, תקרה, קיר, דלת, חלון, מושב, שולחן, ללא. באמצעות סיווג, ניתן לסנן משטחים מיותרים—לדוגמה, להתעלם מהתקרה לניווט רצפתי. הסיווג עובד רק כאשר ARMeshClassification ובמכשירי LiDAR. ללא בדיקת sceneReconstruction = .meshWithClassification—קריסה או התעלמות שקטה.
| סוג משטח | תיאור | יישום |
|---|---|---|
| floor | רצפה | בניית NavMesh, הצבת אובייקטים |
| wall | קיר | הסתרה, התנגשויות |
| ceiling | תקרה | תאורה (בדרך כלל מתעלמים) |
| door | דלת | ניווט דרך פתחים |
| window | חלון | אפקטים מיוחדים |
| seat | מושב | אינטראקציה (ישיבה) |
| table | שולחן | הצבת אובייקטים |
| none | אובייקט לא ידוע | מכשולים (מדפים, משטחים) |
איך אנו נמנעים מירידות ביצועים?
המחסנית המרכזית: ARKit 5+ + RealityKit 2 + Metal. איננו משתמשים ב-SceneKit עבור הרשת—הוא אינו מותאם לגיאומטריות דינמיות. הגדרת סשן:
let config = ARWorldTrackingConfiguration()
config.sceneReconstruction = .meshWithClassification
arView.debugOptions = [.showSceneUnderstanding] // для отладки
arView.session.run(config)לניפוי באגים של ויזואליזציית רשת, אנו מציירים wireframe דרך ARWorldTrackingConfiguration.supportsSceneReconstruction(.meshWithClassification). בייצור, נראות הרשת כבויה, אך אנו משתמשים בנתוניה עבור:
- הסתרה—אובייקטים מאחורי קירות אינם נראים. שחזור סצנה נותן הסתרה מדויקת פי 5 מזיהוי מישורים מקורב.
- פיזיקה—
let config = ARWorldTrackingConfiguration() config.sceneReconstruction = .meshWithClassification arView.debugOptions = [.showSceneUnderstanding] // для отладки arView.session.run(config)מתקשר עם גיאומטריה אמיתית. - Raycast—פגיעה מדויקת במשטחים אמיתיים, לא רק במישורים.
מקרה בוחן: אפליקציית ניווט AR למחסן. היה צורך לזהות מכשולים (מדפים, משטחים) ולבנות מסלול. השתמשנו בשחזור סצנה לבניית רשת תפוסה: כל קודקוד רשת עם סיווג arView.debugOptions (אובייקט לא מזוהה) נוסף לגרף המכשולים. NavMesh עודכן כל 2 שניות—איזון בין רעננות לעומס CPU. ב-iPad Pro M2 זה שומר על 60 FPS ללא ירידות. לשם השוואה: במכשירים ללא LiDAR, היינו צריכים להשתמש בהתנגשויות מפושטות, מה שמגדיל תוצאות חיוביות שגויות ב-40%.
| פרמטר | שחזור סצנה | זיהוי מישורים בלבד |
|---|---|---|
| פרטיות גיאומטריה | ~30,000 קודקודים | 4 מישורים |
| הסתרה | מדויקת, מבוססת רשת | מקורבת עם חפצים |
| פיזיקה | CollisionComponent עם גיאומטריה | רק מישורים |
| תמיכת LiDAR | נדרשת | לא נדרשת |
מה כלול בעבודה שלנו?
- ניתוח דרישות ובחירת מחסנית (ARKit/RealityKit/Metal).
- הגדרת סשן עם שחזור סצנה מופעל.
- פיתוח ויזואליזציית רשת (debug וייצור).
- שילוב נתוני רשת: הסתרה, פיזיקה, raycast.
- אופטימיזציית ביצועים (איגום עדכונים, buffering).
- בדיקות במכשירי LiDAR ו-fallback למכשירים ללא LiDAR.
- תיעוד והדרכת צוות.
תהליך: מרעיון לפריסה
- ניתוח—דיון בתרחישי שימוש וקביעת נתונים נדרשים (הסתרה, ניווט, פיזיקה).
- עיצוב—בחירת ארכיטקטורה (מערכת רכיבים, שילוב ARView ו-Metal).
- יישום—כתיבת קוד ב-Swift, שימוש בתבנית delegate לעדכונים.
- בדיקות—בדיקה במכשירים אמיתיים בתנאים שונים (תאורה, מראות).
- פריסה—שחרור ל-App Store, הגדרת TestFlight לבודקי בטא.
לוחות זמנים ואיך להתחיל
שילוב בסיסי עם ויזואליזציית רשת אורך 1–2 שבועות. אם נדרשים סיווג משטחים, התנגשויות פיזיקה וניווט מבוסס רשת—4–6 שבועות. העלות מחושבת לאחר דיון מפורט בדרישות. צרו קשר לייעוץ—קבלו הערכה לפרויקט שלכם. ניתן גם להזמין ניתוח מקדים של אפליקציית ה-AR שלכם.







