Jetpack XR-এর জন্য ARCore-এর সাথে কাজ করুন

Jetpack XR-এর জন্য ARCore অ্যাপগুলিকে নিম্ন-স্তরের দৃশ্য বোঝার আদিম এবং গতি ট্র্যাকিং ব্যবহার করে অগমেন্টেড রিয়েলিটি (AR) এর মৌলিক ধারণাগুলির সাথে কাজ করার অনুমতি দেয়। AR অভিজ্ঞতা তৈরি করার সময় Jetpack XR-এর জন্য ARCore ব্যবহার করুন এবং আপনাকে স্থানের একটি নির্দিষ্ট স্থানে প্ল্যানার ডেটা বা অ্যাঙ্কর সামগ্রী ব্যবহার করতে হবে।

একটি সেশনের জীবনচক্র বুঝুন

জেটপ্যাক এক্সআর-এর জন্য ARCore দ্বারা ট্র্যাক করা সমস্ত বস্তু একটি সেশনের মাধ্যমে অ্যাক্সেস করতে হবে। একটি কার্যকলাপের জীবনচক্রের মতো, সেশন অবজেক্টেরও একটি জীবনচক্র থাকে যা আপনার অ্যাপের একটি সেশন অবজেক্টের বৈশিষ্ট্যগুলির ব্যবহার অনুযায়ী বজায় রাখতে হবে৷ যদি আপনার অ্যাপে একটি একক XR-সক্ষম কার্যকলাপ থাকে, তাহলে লাইফসাইকেল-সচেতন উপাদান ব্যবহার করে সেশনের জীবনচক্র পরিচালনা করার কথা বিবেচনা করুন।

একটি সেশন তৈরি করুন

এটি ব্যবহার করার আগে একটি সেশন তৈরি করতে হবে। একটি সেশন তৈরি করার জন্য ব্যবহারকারীকে আপনার অ্যাপে android.permission.SCENE_UNDERSTANDING অনুমতি দিতে হবে।

একটি অধিবেশন তৈরি করতে:

when (val result = Session.create(owner)) {
  is SessionCreateSuccess -> {
    session = result.session
  }
  is SessionCreatePermissionsNotGranted -> {
   // Request android.permission.SCENE_UNDERSTANDING.
  }
}

একটি সেশন তৈরি করতে ব্যর্থ হওয়ার কারণগুলির জন্য SessionCreateResult দেখুন৷

একটি অধিবেশন পুনরায় শুরু করুন

আপনার অ্যাপ জেটপ্যাক XR-এর জন্য ARCore থেকে রাজ্য পরিবর্তনগুলি পরিচালনা করার জন্য প্রস্তুত হলে একটি সেশন পুনরায় শুরু করা উচিত। অনেক ক্ষেত্রে, এটি আপনার অ্যাক্টিভিটির onResume() কলব্যাকে করা হয়, কিন্তু আপনার অ্যাপ ব্যবহারকারীর ইন্টারঅ্যাকশন না হওয়া পর্যন্ত প্রক্রিয়াকরণ বিলম্বিত করতে চাইতে পারে।

নিম্নলিখিত কোড স্নিপেট একটি সেশন পুনরায় শুরু করার একটি উদাহরণ দেখায়।

when (val result = session.resume()) {
  is SessionResumeSuccess -> {
    // Session has been created successfully.
    // Attach any successful handlers here.
  }
  is SessionResumePermissionsNotGranted -> {
    // Request android.permission.SCENE_UNDERSTANDING.
}

একটি সেশন পুনরায় শুরু করতে ব্যর্থ হওয়ার কারণগুলির জন্য SessionResumeResult দেখুন৷

একটি অধিবেশন বিরতি

যখন আপনার কার্যকলাপ ব্যাকগ্রাউন্ডে যায়, Session.pause() ব্যবহার করে সেশনটি পজ করুন। একটি অধিবেশন বিরতি অস্থায়ীভাবে সেশন পুনরায় শুরু না হওয়া পর্যন্ত ট্র্যাকিং বন্ধ করে, উপলব্ধি সিস্টেমের অবস্থা বজায় রাখে।

একটি অধিবেশন ধ্বংস

একটি সেশন স্থায়ীভাবে নিষ্পত্তি করতে, Session.destroy() ব্যবহার করুন। এটি সেশনের দ্বারা ব্যবহৃত সংস্থানগুলিকে মুক্ত করে এবং সমস্ত সেশনের অবস্থাকে ধ্বংস করে।

অনুভূত প্লেনগুলির অবস্থা পুনরুদ্ধার করুন

Jetpack XR-এর জন্য ARCore StateFlow মাধ্যমে প্লেনের অবস্থা প্রদান করে যা প্লেনের অবস্থা নির্গত করে। প্লেন যোগ করা, আপডেট করা বা সরানো হলে একটি সেশনে প্লেনে সাবস্ক্রাইব করা আপনার অ্যাপকে সূচিত করে।

Plane.subscribe(session).collect { planes ->
 // Planes have changed; update plane rendering
}

একটি সমতল নিম্নলিখিত বৈশিষ্ট্য আছে:

  • label : প্রদত্ত Plane একটি শব্দার্থিক বর্ণনা। একটি Wall , Floor , Ceiling বা Table হতে পারে।
  • centerPose : সনাক্ত করা সমতলের কেন্দ্রের ভঙ্গি।
  • extents : সনাক্ত করা সমতলের মাত্রা, মিটারে।
  • vertices : একটি উত্তল বহুভুজের শীর্ষবিন্দুর একটি তালিকা যা সমতলকে আনুমানিক করে।

প্লেনের বিরুদ্ধে একটি হিট-টেস্ট করুন

একটি হিট-টেস্ট হল সেশন দ্বারা ট্র্যাক করা বস্তুর সাথে একটি রশ্মির ছেদ গণনা করার একটি পদ্ধতি। একটি হিট-টেস্টের একটি সাধারণ প্রয়োগ হল একটি টেবিলের দিকে নির্দেশ করা এবং সেই অবস্থানে একটি বস্তু স্থাপন করা। হিট-পরীক্ষা পরিচালনা করলে হিট অবজেক্টের একটি তালিকা হয়। অন্য কথায়, একটি হিট-পরীক্ষা প্রথম বস্তুর আঘাতে থামে না। যাইহোক, প্রায়ই আপনি শুধুমাত্র একটি প্রদত্ত ধরনের প্রথম অবজেক্ট হিট আগ্রহী হতে পারে.

একটি হিট-টেস্ট করতে, একটি Ray এর সাথে Interaction.hitTest() ব্যবহার করুন:

val results = Interaction.hitTest(session, ray)
// When interested in the first Table hit:
val tableHit = results.firstOrNull {
  val trackable = it.trackable
  trackable is Plane && trackable.state.value.label == Plane.Label.Table
}

স্থানের একটি নির্দিষ্ট অবস্থানে বিষয়বস্তু অ্যাঙ্কর করুন

ভার্চুয়াল বস্তুকে বাস্তব জগতে একটি অবস্থান দিতে, একটি Anchor ব্যবহার করুন। একটি অ্যাঙ্কর অবজেক্ট আপনার অ্যাপকে ফিজিক্যাল স্পেসে একটি নির্দিষ্ট অবস্থানের ট্র্যাক রাখতে সাহায্য করে।

একটি Pose ব্যবহার করে একটি অ্যাঙ্কর তৈরি করা হয়, যা বিদ্যমান Trackable বা না হওয়া সম্পর্কিত ব্যাখ্যা করা যেতে পারে।

একটি Trackable আপেক্ষিক একটি নোঙ্গর তৈরি করুন

যখন একটি অ্যাঙ্কর তৈরি করা হয় একটি Trackable , যেমন একটি Plane , যা অ্যাঙ্করটিকে সংযুক্ত Trackable অনুসরণ করে যখন এটি স্থানের মধ্য দিয়ে চলে যায়।

val anchor = trackable.createAnchor(pose)

একটি ট্র্যাকযোগ্য ছাড়া একটি নোঙ্গর তৈরি করুন

Trackable সাথে সংযুক্ত নয় এমন একটি অ্যাঙ্কর তৈরি করতে:

when (val result = Anchor.create(session, pose)) {
  is AnchorCreateSuccess -> // ...
  else -> // handle failure
}

একটি নোঙ্গর একটি সত্তা সংযুক্ত করুন

এই অবস্থানে একটি মডেল রেন্ডার করতে, একটি GltfModel তৈরি করুন এবং এর ভঙ্গিটি অ্যাঙ্করের ভঙ্গিতে সেট করুন৷ অ্যাঙ্করের TrackingState Stopped গেলে মডেলটি লুকানো আছে তা নিশ্চিত করুন।

// renderSession is androidx.xr.core.Session
anchor.state.collect { state ->
  if (state.trackingState == TrackingState.Tracking) {
    gltfEntity.setPose(
      renderSession.perceptionSpace.transformPoseTo(state.pose, renderSession.activitySpace)
    )
  } else if (state.trackingState == TrackingState.Stopped) {
    entity.setHidden(true)
  }
}

TrackingState বুঝুন

প্রতিটি Trackable একটি TrackingState রয়েছে যা ব্যবহার করার আগে পরীক্ষা করা উচিত। একটি Trackable যার Tracking এর একটি TrackableState রয়েছে তার Pose সিস্টেম দ্বারা সক্রিয়ভাবে আপডেট করা হয়েছে। একটি Trackable যা Paused তা ভবিষ্যতে Tracking হয়ে উঠতে পারে, যেখানে Stopped হয়েছে তা কখনই Tracking হবে না।

সেশন জুড়ে একটি অ্যাঙ্কর বজায় রাখুন

একটি নোঙ্গর যা স্থায়ী হয় না একটি অধিবেশন ধ্বংস হওয়ার পরে অদৃশ্য হয়ে যায়। একটি অ্যাঙ্কর ধরে রাখার মাধ্যমে, আপনার অ্যাপটি তার ব্যক্তিগত অ্যাপ ডেটাতে সেই অ্যাঙ্করের অবস্থান মনে রাখে। এই অ্যাঙ্করটি পরবর্তী সেশনে পুনরুদ্ধার করা যেতে পারে এবং বিশ্বের একই স্থানে নোঙ্গর করা হয়।

একটি নোঙ্গর বজায় রাখতে, এখানে দেখানো হিসাবে anchor.persist() ব্যবহার করুন:

val uuid = anchor.persist()

আপনার অ্যাপ ভবিষ্যতের সেশনে UUID ব্যবহার করে অ্যাঙ্কর পুনরুদ্ধার করতে পারে:

when (val result = Anchor.load(session, uuid)) {
  is AnchorCreateSuccess -> // Loading was successful. The anchor is stored in result.anchor.
  else -> // handle failure
}

যখন আপনার আর কোনো নোঙ্গরের প্রয়োজন হয় না, তখন unpersist() কল করুন। এটি আপনার অ্যাপের সঞ্চয়স্থান থেকে অ্যাঙ্করটিকে সরিয়ে দেয় এবং Anchor.load() এ কল করার জন্য প্রদত্ত UUID-কে পুনরুদ্ধারযোগ্য করে তোলে।

Anchor.unpersist(session, uuid)

আপনার অ্যাপটি এমন সমস্ত অ্যাঙ্করগুলির একটি তালিকার জন্য অনুরোধ করতে পারে যা এখনও আপনার অ্যাপের স্টোরেজে উপস্থিত রয়েছে:

val uuids = Anchor.getPersistedAnchorUuids(session)