מיקום אובייקטים תלת-ממדיים ב-AR: מ-Raycast לייצוב
אנחנו פותרים זאת באופן קבוע עבור לקוחות בתחום הרהיטים והקמעונאות. לגרום למודל תלת-ממדי לשבת ביציבות על מישור שזוהה אינו משימה של ערב אחד. האובייקט חייב להישאר ישר כשהמצלמה זזה, לא "לרחף" תחת תאורה משתנה, להתאים קנה מידה כראוי, ולא לשקוע לתוך המשטח. אנו מציעים הטמעה מלאה: מבחירת פורמט המודל ועד לשילוב סופי באפליקציה. בפרויקט אחד עבור קמעונאי רהיטים, נתקלנו בבעיה של האובייקט "שוקע" לתוך המישור בזמן תנועת מצלמה מהירה. הפתרון היה שימוש ב-ARAnchor עם היסט דינמי של 2 מ"מ לאורך הנורמל — זה ביטל את ה-Z-fighting תחת כל תאורה.
פורמטים של מודלים תלת-ממדיים ואופטימיזציה ל-AR
התקן ל-AR נייד הוא USDZ (iOS/RealityKit) ו-GLB/GLTF (ARCore/חוצה-פלטפורמות). טעות נפוצה: לקחת מודל לא מותאם ולנסות לטעון אותו ל-AR. 500 אלף משולשים, טקסטורות 4096×4096 ללא mip-mapping מבטיחים ירידת FPS במכשירים מתחת ל-A13.
פרמטרים יעד ל-AR נייד:
| סוג אובייקט | פוליגונים | טקסטורות | גודל GLB |
|---|---|---|---|
| פריט קטן (כיסא, מנורה) | עד 30 אלף | 1024×1024 | עד 5 מ"ב |
| אובייקט בינוני (ספה, שולחן) | עד 80 אלף | 2048×2048 | עד 15 מ"ב |
| גדול (סט רהיטים, מטבח) | עד 200 אלף | 2048×2048 | עד 40 מ"ב |
דחיסה: KTX2 + Basis Universal עבור GLB, טקסטורות HEIC ב-USDZ. ב-RealityKit — Reality Composer Pro (Xcode 15 ומעלה) לאפיית חומרי PBR ישירות לפורמט .reality. עבור Android, השתמשו ב-Android Studio עם ARCore SDK 1.30+ להמרת GLB.
למה Raycast עדיף על hitTest למיקום?
עם ARKit 4+ ו-ARCore 1.18+, השיטה המועדפת לקביעת נקודת המיקום היא Raycast. היא מחזירה ARRaycastResult עם target: .existingPlaneGeometry או .estimatedPlane. existingPlaneGeometry משתמש בגיאומטריה שכבר זוהתה — הדיוק גבוה פי 2 מה-hitTest המיושן. אפל ממליצה על raycast כשיטה הראשית (ראו תיעוד ARKit). יתרה מכך, hitTest הוצא משימוש ב-iOS 14, והשימוש בו עלול להוביל לדחיית האפליקציה עקב הנחיות סקירת App Store (סעיף 4.2: פונקציונליות מינימלית).
דוגמה ב-Swift:
let query = arView.makeRaycastQuery(
from: arView.center,
allowing: .existingPlaneGeometry,
alignment: .horizontal
)
let results = arView.session.raycast(query)
if let first = results.first {
placeEntity(at: first.worldTransform)
}עבור ARCore — let query = arView.makeRaycastQuery( from: arView.center, allowing: .existingPlaneGeometry, alignment: .horizontal ) let results = arView.session.raycast(query) if let first = results.first { placeEntity(at: first.worldTransform) } + Session.createRaycastQuery() נותן תוצאות יציבות יותר בקצוות המישור.
ייצוב האובייקט לאחר המיקום
לאחר המיקום, האובייקט לא אמור "לנדוד" כשהמצלמה זזה. הגישה הסטנדרטית היא להתחבר ל-Frame.raycast() דרך AnchorEntity:
let anchor = ARAnchor(transform: worldTransform)
arView.session.add(anchor: anchor)
let anchorEntity = AnchorEntity(anchor: anchor)
anchorEntity.addChild(modelEntity)
arView.scene.addAnchor(anchorEntity)ARAnchor מפורש נועל את המיקום, והאובייקט לא מתעדכן כשהמישור משתכלל. ללא זה, האובייקט זז במשך 10–15 השניות הראשונות של הסשן בזמן ש-ARKit משכלל את הגיאומטריה. אופציונלית, ניתן להחיל סינון Kalman על מיקום העוגן אם הרעידות נמשכות.
צללים ותאורה פיזית
אובייקט AR ללא צל נראה כאילו הוא מרחף. ב-RealityKit, צל נוצר על ידי הגדרת ARAnchor על הישות — צל מגע נוצר אוטומטית. ב-SceneKit, יש צורך באור כיווני עם let anchor = ARAnchor(transform: worldTransform) arView.session.add(anchor: anchor) let anchorEntity = AnchorEntity(anchor: anchor) anchorEntity.addChild(modelEntity) arView.scene.addAnchor(anchorEntity) . חשוב, בשימוש בטקסטורת סביבה (ARKit, A12+), אובייקטים מקבלים השתקפויות של הסביבה האמיתית. משטחים מתכתיים משקפים את החדר — ללא זה, אובייקט כרום נראה פלסטיק. הפעל castsShadow = true ב-castsShadow = true.
מחוות נתמכות למניפולציה של אובייקט
לאחר המיקום, המשתמש צריך להיות מסוגל להזיז, לסובב ולשנות קנה מידה של האובייקט. ב-RealityKit, מחוות מתווספות בשורה אחת:
arView.installGestures([.translation, .rotation, .scale], for: entity) לשליטה מותאמת אישית, השתמשו ב-environmentTexturing = .automatic עם raycast רציף — זה נותן יותר שליטה על רגישות. בעת יישום סיבוב, הגבל לציר Y: השתמש ב-ARWorldTrackingConfiguration רק סביב הציר האנכי, אחרת האובייקט נוטה עם מחוות לא מדויקות. ב-Android, השתמשו באופן דומה ב-arView.installGestures([.translation, .rotation, .scale], for: entity) מ-Sceneform או ב-UILongPressGestureRecognizer ב-ARCore.
בדיקת מיקום AR במכשירים שונים
חשוב מאוד לבדוק על מספר דורות של אייפונים ומכשירי Android. לדוגמה, ב-iPhone XR (A12) raycast עובד ביציבות, אבל טקסטורת סביבה צורכת זיכרון נוסף — FPS עלול לרדת עם מודלים בעלי פוליגונים גבוהים. אנו ממליצים להשתמש ב-TestFlight ל-iOS ובדיקות פנימיות דרך Google Play ל-Android — זה עוזר לזהות בעיות עומק (Z-fighting) בגרסאות ARCore שונות.
מה כלול בעבודה
| שלב | תוצאה |
|---|---|
| ניתוח מודל ודרישות | בחירת פורמט, אופטימיזציה של פוליגונים/טקסטורות |
| פיתוח מיקום | Raycast, עוגן, ייצוב, צללים |
| יישום מחוות | הזזה, סיבוב, שינוי קנה מידה |
| בדיקת מכשירים | בדיקת יציבות בגרסאות iOS/Android שונות |
| שילוב באפליקציה | תיעוד, גישה למאגר, הדרכת צוות |
השלמנו מעל 20 פרויקטים מוצלחים בפיתוח AR נייד. צרו קשר להערכת פרויקט — אנו מספקים פתרונות סוהר תוך 2–3 שבועות. קבלו ייעוץ ללא התחייבות.







