מסכות AR ומסננים: מאב-טיפוס לייצור
מסכות ומסננים הם התרחיש הנפוץ ביותר של AR לפנים. Snapchat, Instagram Reels ו-TikTok אימנו את המשתמשים לצפות לרמת איכות מסוימת. אם מסכה "צפה" בסיבוב ראש או לא מגיבה להבעות פנים, המשתמש מוחק את האפליקציה. נתקלנו בזה פעמים רבות: במשך 5+ שנים ו-30+ פרויקטי AR, פיתחנו גישה שמבטיחה יציבות וריאליזם. טכנית, המשימה נפתרת היטב עם ARKit ו-RealityKit, אבל יש ניואנסים עם חסימה (occlusion), אנימציה והקלטת וידאו. להלן כיצד אנו מתמודדים עם אתגרים אלה.
סוגי מסכות והיישום הטכני שלהן
מסכה גיאומטרית — רשת תלת-ממדית הנמתחת על הפנים ועוקבת אחר העיוותים שלהן. האפשרות הריאליסטית ביותר. ב-RealityKit אנו משתמשים ב-ModelEntity עם רשת משוכללת (skinned mesh) שהמפרקים שלה מקושרים ל-ARKit blendShapes:
// Face Anchor как root
let faceAnchor = AnchorEntity(.face)
// Загружаем USDZ с morph targets, соответствующими ARKit blendShapes
let maskEntity = try! ModelEntity.load(named: "zombie_face.usdz")
faceAnchor.addChild(maskEntity)
arView.scene.addAnchor(faceAnchor)
// В update loop — применяем blendShapes к morph targets маски
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
guard let faceAnchor = anchors.first as? ARFaceAnchor else { return }
// BlendShape mapping: ARKit jawOpen → mask jaw morph target
}מדבקה שטוחה/שכבת-על — תמונה דו-ממדית או וידאו המחוברים לעוגן פנים. פשוט יותר ליישום, פחות עיוותים. מתאים למסגרות, "כובעים", שפמים מזויפים. אפקטים של חלקיקים — חלקיקים המחוברים לנקודות על הפנים (ניצוצות מהעיניים, עשן מהפה כאשר jawOpen > 0.3). ב-RealityKit — // Face Anchor как root let faceAnchor = AnchorEntity(.face) // Загружаем USDZ с morph targets, соответствующими ARKit blendShapes let maskEntity = try! ModelEntity.load(named: "zombie_face.usdz") faceAnchor.addChild(maskEntity) arView.scene.addAnchor(faceAnchor) // В update loop — применяем blendShapes к morph targets маски func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) { guard let faceAnchor = anchors.first as? ARFaceAnchor else { return } // BlendShape mapping: ARKit jawOpen → mask jaw morph target } עם מערכת חלקיקים מותאמת אישית דרך Reality Composer Pro.
| סוג מסכה | ריאליזם | מורכבות | מקרי שימוש |
|---|---|---|---|
| גיאומטרית | גבוה | גבוהה | זומבים, חיות, דמויות מורכבות |
| מדבקה שטוחה | נמוך | נמוכה | מסגרות, שפמים, כובעים |
| אפקטים של חלקיקים | בינוני | בינונית | ניצוצות, עשן, נצנצים |
כיצד להשיג חסימה (occlusion) ריאליסטית?
הדקות הטכנית העיקרית: אלמנטים וירטואליים של המסכה (קרניים, כתר, משקפיים) חייבים להיחסם על ידי הפנים האמיתיות במקום שבו זה נכון פיזית. כתר הולך מאחורי הראש — החלק האחורי של הראש חוסם אותו. משקפיים "יושבים" על האף — האף חופף את הרקות.
ב-ARKit/RealityKit — רשת חוסמת (occluder mesh): עותק של גיאומטריית הפנים עם חומר Entity. רשת זו אינה נראית למשתמש אך כותבת עומק למאגר העומק. אלמנטים "מאחורי" הפנים נחסמים כראוי:
// Occluder entity — невидимая копия лица
var occluderMaterial = OcclusionMaterial()
let occluderEntity = ModelEntity(
mesh: .init(arFaceGeometry: faceAnchor.geometry),
materials: [occluderMaterial]
)
faceAnchor.addChild(occluderEntity)ללא רשת חוסמת, קרניים בולטות דרך הראש מכל זווית — ונראה זול. הניסיון שלנו מראה ששלב זה מוחמץ על ידי 70% מהמפתחים המתחילים.
אנימציה לפי הבעות פנים: למה זה מורכב?
52 ARKit blendShapes — מיפוי ליעדי מורפינג (morph targets) של המסכה התלת-ממדית. תרחיש סטנדרטי: מסכת זומבי פותחת את הפה על .occlusion, פוזלת בעיניים על // Occluder entity — невидимая копия лица var occluderMaterial = OcclusionMaterial() let occluderEntity = ModelEntity( mesh: .init(arFaceGeometry: faceAnchor.geometry), materials: [occluderMaterial] ) faceAnchor.addChild(occluderEntity) . לרשת המסכה חייבים להיות יעדי מורפינג תואמים עם אותם שמות או דרך טבלת מיפוי.
Reality Composer Pro מאפשר להגדיר jawOpen ישירות ב-USDZ ללא קוד. לאנימציות מורכבות — עדכון מותאם אישית ב-eyeBlinkLeft/Right:
// Передаём blendShapes в shader parameter маски
maskEntity.model?.materials[0].setParameter(
name: "jawOpen",
value: .float(faceAnchor.blendShapes[.jawOpen]?.floatValue ?? 0)
)מיפוי נכון משפר את תגובתיות המסכה פי 2–3 בהשוואה לברירת המחדל. אנו בודקים אנימציות על מספר סוגי פנים כדי למנוע עיוותים.
הקלטת וידאו עם מסכת AR
ARSessionDelegate (ReplayKit) — מקליט את כל המסך כולל תצוגת ה-AR. פשוט אך באיכות נמוכה (מקליט את מה שמופיע על המסך, כולל אלמנטים של ממשק משתמש). להקלטת מצלמת AR נקייה — // Передаём blendShapes в shader parameter маски maskEntity.model?.materials[0].setParameter( name: "jawOpen", value: .float(faceAnchor.blendShapes[.jawOpen]?.floatValue ?? 0) ) + עיבוד RPScreenRecorder מותאם אישית דרך Metal:
// Composite: camera frame + AR overlay → CVPixelBuffer // → AVAssetWriter → .mp4 זה מורכב יותר אך מספק הקלטה נקייה ללא שכבת ממשק משתמש ועם אפשרויות רזולוציה מותאמות אישית. אנו משתמשים בגישה זו בפרויקטים הדורשים ייצוא וידאו באיכות גבוהה.
Lens Studio / Spark AR כחלופה
אם המטרה היא פילטר ויראלי ל-Snap/Instagram/TikTok, לא אפליקציה משלכם: Lens Studio (Snap) ו-Meta Spark (Instagram) מספקות סביבות פיתוח חזותיות ללא קוד native. אפקטים מתפרסמים בפלטפורמה וזמינים למשתמשים באפליקציות ה-native.
לאפליקציה ניידת מותאמת אישית עם מצלמה משלה — רק יישום native או Banuba Face AR SDK. המהנדסים שלנו עובדים עם שתי הגישות ויכולים להעריך מה מתאים לכם.
מה העבודה שלנו כוללת
- ניתוח ואב-טיפוס של המסכה (בחירת סוג, עיצוב, אנימציות)
- מידול רשת תלת-ממדית או הכנת מדבקה דו-ממדית
- הגדרת רשת חוסמת ומיפוי blendShape
- אינטגרציה עם האפליקציה שלכם (Swift/SwiftUI, Kotlin, Flutter)
- בדיקות על 5+ מכשירים ותיקון באגים
- סיוע בפרסום ב-App Store / Google Play (במידת הצורך)
- תיעוד אינטגרציה ותמיכה של שבועיים לאחר המסירה
לוחות זמנים ועלות
מסכה סטטית בסיסית (רשת תלת-ממדית סטטית, ללא אנימציית blendShape) — 4–6 ימים. מסכה עם אנימציה כולל רשת חוסמת ו-3–5 תגובות blendShape — 2–3 שבועות. הקלטת וידאו בתוספת גלריית מסכות עם העלאה לענן — עוד 2–3 שבועות. העלות נקבעת באופן אישי לאחר הערכת המשימה שלכם. קבלו ייעוץ — צרו קשר, ונשלח הצעה מסחרית ראשונית תוך יום.







