הוספת נתונים בהתאמה אישית תוך כדי צילום ב-Android

ממשק ה-API להקלטה ולהפעלה מאפשר להקליט סשן ולהשתמש בו במקום בפיד מצלמה בזמן אמת. עם זאת, ההקלטות האלה מכילות רק נתונים של סרטונים וחיישנים. אתם יכולים גם להוסיף נתונים מותאמים אישית להקלטה של הסשן ולהחזיר לכם את הנתונים במהלך ההפעלה, כאילו הם חלק מתמונת מצלמה.

ARCore לא כולל באופן אוטומטי נתונים בהתאמה אישית בהקלטות. במקום זאת, היא מאפשרת להוסיף נתונים בהתאמה אישית למסגרת ARCore במהלך ההקלטה, ולאחזר את אותם נתונים מהפריים במהלך ההפעלה. מחובתכם לתכנת את האפליקציה כך שהמשתמש יקבל את הנתונים שהוא מצפה להם כשהוא יפעיל את הסשן שלו.

תרחישים לדוגמה לנתונים מותאמים אישית

הוספה של נתונים בהתאמה אישית להקלטות מגדילה את האפשרויות של אפליקציות ה-AR שלכם. בהמשך מפורטים כמה תרחישים ספציפיים לדוגמה.

שימוש ב-AR בדרכים

בעבר, משתמשים יכלו לגשת לחוויות ה-AR רק במקום הנכון ובזמן הנכון. אם הם רצו להציב מנורת AR בסלון שלהם, הם היו צריכים לעמוד פיזית במיקום כדי לראות איך המנורה תיראה שם. עם טראקים בהתאמה אישית, הם יכולים להקליט את הסלון פעם אחת, ולהוסיף ריהוט וירטואלי לסצנה בכל זמן שהם רוצים.

יצירה משותפת של חוויות AR

ללא דרישה בסשן פעיל, למשתמשים יש הרבה יותר אפשרויות לעריכת AR, שמאפשרות להם ליצור תוכן ייחודי ב-AR ולגשת אליו בכל מקום ובכל שעה. לדוגמה, הם יכולים להקליט סביבה מסוימת, להוסיף אפקטים של מציאות רבודה ולשתף אותם עם חברים.

דרישות מוקדמות

לפני שממשיכים, חשוב לוודא שאתם מבינים את המושגים הבסיסיים של AR ואת האופן שבו מגדירים סשן של ARCore.

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

יצירת הקלטה של הסשן עם נתונים בהתאמה אישית.

התחלת הקלטה עם נתונים בהתאמה אישית

כדי להתחיל הקלטה באמצעות נתונים בהתאמה אישית, פועלים לפי השלבים הבאים: כדי להתחיל, להפסיק ולבדוק סשן הקלטה, מומלץ לעיין במאמר הקלטה והפעלה של סשן AR.

  1. מקבלים RecordingConfig.
  2. יוצרים Track חדש עם UUID בהתאמה אישית. כל הנתונים בהתאמה אישית יישמרו כאן.
  3. מוסיפים את Track ל-RecordingConfig שיצרתם במהלך הגדרת הסשן.

Java

// Initialize a new track with a custom UUID.
// Make sure to save the UUID because it is the ID that you will use
// to get your data back during playback.
UUID trackUUID = UUID.fromString("de5ec7a4-09ec-4c48-b2c3-a98b66e71893"); // from UUID generator
Track track = new Track(session).setId(trackUUID);

// Add the Track to the recordingConfig.
// recordingConfig must already be configured.
recordingConfig.addTrack(track);

Kotlin

// Initialize a new track with a custom UUID.
// Make sure to save the UUID because it is the ID that you will use
// to get your data back during playback.
val trackUUID = UUID.fromString("de5ec7a4-09ec-4c48-b2c3-a98b66e71893") // from UUID generator
val track = Track(session).setId(trackUUID)

// Add the Track to the recordingConfig.
// recordingConfig must already be configured.
recordingConfig.addTrack(track)

כל הטראקים החדשים נחשבים כהקלטות נפרדות, ולכל טראק מוקלט יש מזהה ייחודי אוניברסלי (UUID) משלו.

אופציונלי: מגדירים את המסלול עם נתונים נוספים

למקרה שתרצו לזהות אותה מאוחר יותר, תוכלו להגדיר מסלול עם נתונים נוספים שמתארים את הקלטת הסשן. לדוגמה, אפשר 'לתייג' מסלול על ידי הוספת הערה שמתארת את המיקום והשעה שבהם תיעדתם את הסשן: "הסשן הזה תועד בקניון אחר הצהריים".

Java

// Set additional data on this track.
// For example, describe where you recorded the session.
byte[] customTrackData = "airport".getBytes(StandardCharsets.UTF_8);
track.setMetadata(ByteBuffer.wrap(customTrackData));

Kotlin

// Set additional data on this track.
// For example, describe where you recorded the session.
val customTrackData: ByteArray = "airport".toByteArray()
track.setMetadata(ByteBuffer.wrap(customTrackData))

אופציונלי: הגדרת הטראק באמצעות סוג MIME

אם האפליקציה שלכם צריכה להיות תואמת לכלים חיצוניים, ניתן להגדיר טראק עם סוג MIME שמתאר את סוג הנתונים שתועדו במסלול. אם לא מציינים סוג, הנתונים יסווגו בתור application/text. ARCore מתעלם מסוג MIME בעת קריאת נתונים.

Java

// Set a MIME type for compatibility with external tools.
track.setMimeType("text/csv");

Kotlin

// Set a MIME type for compatibility with external tools.
track.setMimeType("text/csv")

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

כל נתוני המסלולים המותאמים אישית מתועדים ב-Frames. בסשנים ב-AR נעשה שימוש ב-session.update() כדי לקבל מסגרת. שעת תיעוד הנתונים לפריים זהה למועד שבו הנתונים יוחזרו במהלך ההפעלה. לדוגמה, אם תקראו ל-recordTrackData() עם הערך "A" ב-00:07:02, תקבלו את "A" בחזרה בסימן 00:07:02 כשהטראק יופעל.

כדי להקליט מסלול נתונים בהתאמה אישית, ממירים את הנתונים ל-ByteBuffer ומתקשרים אל recordTrackData().

Java

// Place an AR lamp in a room.
if (placeLampButtonWasPressed) {
  Lamp lampProduct = Lamp.FLOOR; // a floor lamp
  // Convert the lamp data into a byte array.
  ByteBuffer lampData = ByteBuffer.wrap(new byte[] {(byte) lampProduct.ordinal()});
  frame.recordTrackData(trackUUID, lampData);
}

Kotlin

// Place an AR lamp in a room.
if (placeLampButtonWasPressed) {
  val lampProduct = Lamp.FLOOR // a floor lamp
  // Convert the lamp data into a byte array.
  val lampData = ByteBuffer.wrap(byteArrayOf(lampProduct.ordinal.toByte()))
  frame.recordTrackData(trackUUID, lampData)
}

הפעלת טראקים של נתונים בהתאמה אישית

חילוץ נתונים מותאמים אישית מהקלטת סשן במהלך הפעלה.

התחלת הפעלה

הפעלת הפעלה באמצעות נתונים בהתאמה אישית זהה לאתחול הפעלה של הקלטה של סשן רגיל.

החזרת נתונים מותאמים אישית

צריך להתקשר ל-getUpdatedTrackData() כדי לאחזר את הנתונים המותאמים אישית שתועדו במסגרת. ניתן לאחזר נתוני מסלולים מרובים מאותה מסגרת. לדוגמה: אם התקשרתם ל-recordTrackData() פעמיים באותה פריים במהלך ההקלטה, תקבלו חזרה שני מופעים של TrackData במהלך ההפעלה.

Java

// Fetch the data recorded on a select frame and place it in a container object.
Collection<TrackData> trackDataList = frame.getUpdatedTrackData(trackUUID);

Kotlin

// Fetch the data recorded on a select frame and place it in a container object.
val trackDataList: Collection<TrackData> = frame.getUpdatedTrackData(trackUUID)

אחרי שה-TrackData נמצא באובייקט מאגר, מחלצים את הבייטים של הנתונים המותאמים אישית.

Java

// Extract the bytes of custom data from the list of track data.
for (TrackData trackData : trackDataList) {
  ByteBuffer bytes = trackData.getData();
  Lamp lamp = Lamp.values()[bytes.get()]; // this is the lamp!
}

Kotlin

// Extract the bytes of custom data from the list of track data.
for (trackData in trackDataList) {
  val bytes = trackData.data
  val lamp = Lamp.values()[bytes.get().toInt()] // this is the lamp!
}

מה השלב הבא?

  • ב-Codelab מוסבר איך ליצור אפליקציה משלכם באמצעות 'הקלטה והפעלה'.