1. আপনি শুরু করার আগে
বিমূর্ত
এই কোডল্যাব আপনাকে শেখায় যে কীভাবে অ্যান্ড্রয়েডে অগমেন্টেড রিয়েলিটিতে (এআর) কাছাকাছি স্থানগুলি প্রদর্শন করতে Google মানচিত্র প্ল্যাটফর্ম থেকে ডেটা ব্যবহার করতে হয়।
পূর্বশর্ত
- অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে অ্যান্ড্রয়েড ডেভেলপমেন্টের প্রাথমিক ধারণা
- কোটলিনের সাথে পরিচিতি
আপনি কি শিখবেন
- ডিভাইসের ক্যামেরা এবং অবস্থান অ্যাক্সেস করার জন্য ব্যবহারকারীর কাছ থেকে অনুমতির অনুরোধ করুন।
- ডিভাইসের অবস্থানের আশেপাশে আশেপাশের স্থানগুলি আনতে Places API এর সাথে একীভূত করুন৷
- অনুভূমিক সমতল পৃষ্ঠগুলি খুঁজে পেতে ARCore-এর সাথে একীভূত করুন যাতে ভার্চুয়াল বস্তুগুলিকে Sceneform ব্যবহার করে 3D স্পেসে নোঙর করা এবং স্থাপন করা যায়।
- সেন্সর ম্যানেজার ব্যবহার করে স্পেসে ডিভাইসের অবস্থান সম্পর্কে তথ্য সংগ্রহ করুন এবং সঠিক শিরোনামে ভার্চুয়াল অবজেক্টের অবস্থান করতে Android ইউটিলিটি লাইব্রেরির জন্য Maps SDK ব্যবহার করুন।
আপনি কি প্রয়োজন হবে
- Android Studio 2020.3.1 বা তার বেশি
- একটি ডেভেলপমেন্ট মেশিন যা OpenGL ES 3.0 বা উচ্চতর সমর্থন করে
- একটি ARCore সমর্থিত ডিভাইস বা একটি ARCore সক্ষম অ্যান্ড্রয়েড এমুলেটর (পরবর্তী ধাপে নির্দেশাবলী দেওয়া হয়েছে)
2. সেট আপ করুন
অ্যান্ড্রয়েড স্টুডিও
এই কোডল্যাবটি Android 10.0 (API লেভেল 29) ব্যবহার করে এবং আপনার Android স্টুডিওতে Google Play পরিষেবা ইনস্টল থাকা প্রয়োজন। এই উভয় নির্ভরতা ইনস্টল করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করুন:
- SDK ম্যানেজারে যান, যা আপনি টুলস > SDK ম্যানেজার এ ক্লিক করে অ্যাক্সেস করতে পারবেন।
- Android 10.0 ইনস্টল করা আছে কিনা তা পরীক্ষা করুন। যদি না হয়, তাহলে Android 10.0 (Q) এর পাশের চেকবক্সটি নির্বাচন করে এটি ইনস্টল করুন, তারপর ওকে ক্লিক করুন এবং অবশেষে প্রদর্শিত ডায়ালগে আবার ঠিক আছে ক্লিক করুন৷
- সবশেষে, SDK টুলস ট্যাবে গিয়ে Google Play পরিষেবাগুলি ইনস্টল করুন, Google Play পরিষেবাগুলির পাশের চেকবক্সটি নির্বাচন করুন, ঠিক আছে ক্লিক করুন, তারপরে প্রদর্শিত ডায়ালগে আবার ঠিক আছে নির্বাচন করুন**.**
প্রয়োজনীয় API
নিম্নলিখিত বিভাগের ধাপ 3-এ, এই কোডল্যাবের জন্য Android এর জন্য Maps SDK এবং Places API সক্ষম করুন৷
Google Maps প্ল্যাটফর্ম দিয়ে শুরু করুন
আপনি যদি আগে Google মানচিত্র প্ল্যাটফর্ম ব্যবহার না করে থাকেন তবে Google মানচিত্র প্ল্যাটফর্মের সাথে শুরু করুন নির্দেশিকা অনুসরণ করুন বা নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করতে Google মানচিত্র প্ল্যাটফর্ম প্লেলিস্টের সাথে শুরু করুন:
- একটি বিলিং অ্যাকাউন্ট তৈরি করুন।
- একটি প্রকল্প তৈরি করুন।
- Google মানচিত্র প্ল্যাটফর্ম API এবং SDK সক্ষম করুন (আগের বিভাগে তালিকাভুক্ত)৷
- একটি API কী তৈরি করুন।
ঐচ্ছিক: অ্যান্ড্রয়েড এমুলেটর
আপনার কাছে ARCore সমর্থিত ডিভাইস না থাকলে, আপনি বিকল্পভাবে একটি AR দৃশ্যের অনুকরণের পাশাপাশি আপনার ডিভাইসের অবস্থান জাল করতে Android এমুলেটর ব্যবহার করতে পারেন। প্রদত্ত যে আপনি এই অনুশীলনে সিনফর্ম ব্যবহার করবেন, আপনাকে "সিনফর্ম সমর্থন করার জন্য এমুলেটর কনফিগার করুন" এর অধীনে পদক্ষেপগুলি অনুসরণ করতে হবে তাও নিশ্চিত করতে হবে।
3. দ্রুত শুরু
আপনাকে যত তাড়াতাড়ি সম্ভব শুরু করতে, এই কোডল্যাবটি অনুসরণ করতে আপনাকে সাহায্য করার জন্য এখানে কিছু স্টার্টার কোড রয়েছে৷ সমাধানে ঝাঁপ দিতে আপনাকে স্বাগত জানাই, কিন্তু আপনি যদি সমস্ত পদক্ষেপ দেখতে চান তবে পড়তে থাকুন।
আপনি যদি git
ইনস্টল করে থাকেন তবে আপনি সংগ্রহস্থলটি ক্লোন করতে পারেন।
git clone https://github.com/googlecodelabs/display-nearby-places-ar-android.git
বিকল্পভাবে, আপনি উৎস কোড ডাউনলোড করতে নীচের বোতামে ক্লিক করতে পারেন।
কোড পাওয়ার পরে, এগিয়ে যান এবং starter
ডিরেক্টরির ভিতরে পাওয়া প্রকল্পটি খুলুন।
4. প্রকল্প ওভারভিউ
আগের ধাপ থেকে ডাউনলোড করা কোডটি অন্বেষণ করুন। এই সংগ্রহস্থলের ভিতরে, আপনি app
নামের একটি একক মডিউল খুঁজে পাবেন, যেটিতে com.google.codelabs.findnearbyplacesar
প্যাকেজ রয়েছে ।
AndroidManifest.xml
এই কোডল্যাবে প্রয়োজনীয় বৈশিষ্ট্যগুলি ব্যবহার করতে আপনাকে সক্ষম করার জন্য AndroidManifest.xml
ফাইলে নিম্নলিখিত বৈশিষ্ট্যগুলি ঘোষণা করা হয়েছে:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Sceneform requires OpenGL ES 3.0 or later. -->
<uses-feature
android:glEsVersion="0x00030000"
android:required="true" />
<!-- Indicates that app requires ARCore ("AR Required"). Ensures the app is visible only in the Google Play Store on devices that support ARCore. For "AR Optional" apps remove this line. -->
<uses-feature android:name="android.hardware.camera.ar" />
uses-permission
জন্য, যা নির্দিষ্ট করে যে সেই ক্ষমতাগুলি ব্যবহার করার আগে ব্যবহারকারীর দ্বারা কোন অনুমতিগুলি মঞ্জুর করতে হবে, নিম্নলিখিতগুলি ঘোষণা করা হয়েছে:
-
android.permission.INTERNET
— এটা যাতে আপনার অ্যাপ নেটওয়ার্ক অপারেশন করতে পারে এবং ইন্টারনেটের মাধ্যমে ডেটা আনতে পারে, যেমন Places API এর মাধ্যমে স্থানের তথ্য। -
android.permission.CAMERA
—ক্যামেরা অ্যাক্সেস প্রয়োজন যাতে আপনি বর্ধিত বাস্তবতায় বস্তু প্রদর্শন করতে ডিভাইসের ক্যামেরা ব্যবহার করতে পারেন। -
android.permission.ACCESS_FINE_LOCATION
—অবস্থান অ্যাক্সেস প্রয়োজন যাতে আপনি ডিভাইসের অবস্থানের সাথে সম্পর্কিত কাছাকাছি স্থানগুলি আনতে পারেন।
uses-feature
জন্য, যা নির্দিষ্ট করে এই অ্যাপটির জন্য কোন হার্ডওয়্যার বৈশিষ্ট্যগুলি প্রয়োজন, নিম্নলিখিতগুলি ঘোষণা করা হয়েছে:
- OpenGL ES সংস্করণ 3.0 প্রয়োজন।
- ARCore সক্ষম ডিভাইস প্রয়োজন।
উপরন্তু, অ্যাপ্লিকেশন অবজেক্টের অধীনে নিম্নলিখিত মেটাডেটা ট্যাগ যোগ করা হয়েছে:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!--
Indicates that this app requires Google Play Services for AR ("AR Required") and causes
the Google Play Store to download and install Google Play Services for AR along with
the app. For an "AR Optional" app, specify "optional" instead of "required".
-->
<meta-data
android:name="com.google.ar.core"
android:value="required" />
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_maps_key" />
<!-- Additional elements here -->
</application>
প্রথম মেটা-ডেটা এন্ট্রিটি নির্দেশ করে যে এই অ্যাপটি চালানোর জন্য ARCore একটি প্রয়োজনীয়তা এবং দ্বিতীয়টি হল আপনি কীভাবে Android এর জন্য Maps SDK-এ আপনার Google Maps Platform API কী প্রদান করবেন।
build.gradle
build.gradle
এ, নিম্নলিখিত অতিরিক্ত নির্ভরতাগুলি নির্দিষ্ট করা হয়েছে:
dependencies {
// Maps & Location
implementation 'com.google.android.gms:play-services-location:17.0.0'
implementation 'com.google.android.gms:play-services-maps:17.0.0'
implementation 'com.google.maps.android:maps-utils-ktx:1.7.0'
// ARCore
implementation "com.google.ar.sceneform.ux:sceneform-ux:1.15.0"
// Retrofit
implementation "com.squareup.retrofit2:retrofit:2.7.1"
implementation "com.squareup.retrofit2:converter-gson:2.7.1"
}
এখানে প্রতিটি নির্ভরতার একটি সংক্ষিপ্ত বিবরণ রয়েছে:
-
com.google.android.gms
গ্রুপ আইডি সহ লাইব্রেরিগুলি, যথাplay-services-location
এবংplay-services-maps
, ডিভাইসের অবস্থানের তথ্য অ্যাক্সেস করতে এবং Google মানচিত্রের সাথে সম্পর্কিত কার্যকারিতা অ্যাক্সেস করতে ব্যবহৃত হয়। -
com.google.maps.android:maps-utils-ktx
হল অ্যান্ড্রয়েড ইউটিলিটি লাইব্রেরির জন্য Maps SDK-এর জন্য Kotlin এক্সটেনশন (KTX) লাইব্রেরি৷ এই লাইব্রেরিতে কার্যকারিতা ব্যবহার করা হবে পরবর্তীতে ভার্চুয়াল অবজেক্টকে রিয়েল স্পেসে রাখার জন্য। -
com.google.ar.sceneform.ux:sceneform-ux
হল Sceneform লাইব্রেরি, যা আপনাকে OpenGL না শিখেই বাস্তবসম্মত 3D দৃশ্য রেন্ডার করতে দেয়। - গ্রুপ আইডি
com.squareup.retrofit2
এর মধ্যে নির্ভরতাগুলি হল Retrofit নির্ভরতা, যা আপনাকে Places API-এর সাথে ইন্টারঅ্যাক্ট করার জন্য দ্রুত একটি HTTP ক্লায়েন্ট লিখতে সক্ষম করে।
প্রকল্প কাঠামো
এখানে আপনি নিম্নলিখিত প্যাকেজ এবং ফাইল পাবেন:
- **api—**এই প্যাকেজটিতে এমন ক্লাস রয়েছে যা Retrofit ব্যবহার করে Places API-এর সাথে ইন্টারঅ্যাক্ট করতে ব্যবহৃত হয়।
- **ar—**এই প্যাকেজে ARCore সম্পর্কিত সমস্ত ফাইল রয়েছে।
- **মডেল—**এই প্যাকেজটিতে একটি একক ডেটা ক্লাস
Place
রয়েছে, যা Places API দ্বারা প্রত্যাবর্তিত একটি একক স্থানকে এনক্যাপসুলেট করতে ব্যবহৃত হয়। - MainActivity.kt — এটি আপনার অ্যাপের মধ্যে থাকা একক
Activity
, যা একটি মানচিত্র এবং একটি ক্যামেরা ভিউ প্রদর্শন করবে।
5. দৃশ্য সেট আপ করা
বর্ধিত-বাস্তবতার অংশগুলি দিয়ে শুরু করে অ্যাপের মূল উপাদানগুলিতে ডুব দিন।
MainActivity
এ একটি SupportMapFragment
রয়েছে, যা মানচিত্র অবজেক্টের প্রদর্শন পরিচালনা করবে এবং একটি ArFragment
— PlacesArFragment
— যেটি পরিবর্ধিত বাস্তবতার দৃশ্য প্রদর্শন পরিচালনা করে।
অগমেন্টেড রিয়েলিটি সেটআপ
অগমেন্টেড রিয়েলিটি সিন প্রদর্শন করা ছাড়াও, PlacesArFragment
ব্যবহারকারীর কাছ থেকে ক্যামেরার অনুমতি নেওয়ার অনুরোধও পরিচালনা করবে যদি ইতিমধ্যে মঞ্জুর না করা হয়। getAdditionalPermissions
পদ্ধতিকে ওভাররাইড করে অতিরিক্ত অনুমতির অনুরোধ করা যেতে পারে। প্রদত্ত যে আপনার মঞ্জুর করার জন্য অবস্থানের অনুমতিও প্রয়োজন, সেটি নির্দিষ্ট করুন এবং getAdditionalPermissions
পদ্ধতিটি ওভাররাইড করুন:
class PlacesArFragment : ArFragment() {
override fun getAdditionalPermissions(): Array<String> =
listOf(Manifest.permission.ACCESS_FINE_LOCATION)
.toTypedArray()
}
চালাও এটা
এগিয়ে যান এবং অ্যান্ড্রয়েড স্টুডিওতে ডিরেক্টরি starter
কঙ্কাল কোডটি খুলুন। আপনি যদি টুলবার থেকে Run > Run 'app' এ ক্লিক করেন এবং অ্যাপটিকে আপনার ডিভাইস বা এমুলেটরে স্থাপন করেন, আপনাকে প্রথমে লোকেশন এবং ক্যামেরার অনুমতি সক্ষম করার জন্য অনুরোধ করা উচিত। এগিয়ে যান এবং অনুমতিতে ক্লিক করুন এবং এটি করার পরে, আপনি একটি ক্যামেরা ভিউ এবং একটি ম্যাপ ভিউ দেখতে পাবেন এভাবে:
বিমান সনাক্তকরণ
আপনি আপনার ক্যামেরার সাথে যে পরিবেশে আছেন তার চারপাশে তাকানোর পরে, আপনি অনুভূমিক পৃষ্ঠের উপর আচ্ছাদিত কয়েকটি সাদা বিন্দু লক্ষ্য করতে পারেন, এই চিত্রের কার্পেটে সাদা বিন্দুর মতো।
এই সাদা বিন্দুগুলি হল ARCore দ্বারা প্রদত্ত নির্দেশিকা যা নির্দেশ করে যে একটি অনুভূমিক সমতল সনাক্ত করা হয়েছে। এই শনাক্ত করা প্লেনগুলি আপনাকে "অ্যাঙ্কর" বলা হয় তা তৈরি করতে দেয় যাতে আপনি ভার্চুয়াল বস্তুগুলিকে বাস্তব স্থানে অবস্থান করতে পারেন।
ARCore সম্পর্কে আরও তথ্যের জন্য এবং এটি কীভাবে আপনার চারপাশের পরিবেশ বুঝতে পারে, এর মৌলিক ধারণাগুলি সম্পর্কে পড়ুন।
6. কাছাকাছি জায়গা পান
এরপরে, আপনাকে প্লেস এপিআই ব্যবহার করে আশেপাশের জায়গাগুলি নিয়ে ডিভাইসের বর্তমান অবস্থান অ্যাক্সেস এবং প্রদর্শন করতে হবে৷
মানচিত্র সেটআপ
Google Maps Platform API কী
আগে, আপনি একটি Google মানচিত্র প্ল্যাটফর্ম এপিআই কী তৈরি করেছেন প্লেসেস এপিআই অনুসন্ধান সক্ষম করতে এবং Android এর জন্য মানচিত্র SDK ব্যবহার করতে সক্ষম হতে। এগিয়ে যান এবং gradle.properties
ফাইলটি খুলুন এবং আপনার তৈরি API কী দিয়ে "YOUR API KEY HERE"
স্ট্রিংটি প্রতিস্থাপন করুন।
ম্যাপে ডিভাইসের অবস্থান প্রদর্শন করুন
একবার আপনি আপনার API কী যোগ করলে, ব্যবহারকারীরা যেখানে মানচিত্রের সাপেক্ষে তাদের অভিমুখী করতে সহায়তা করতে মানচিত্রে একজন সাহায্যকারী যোগ করুন। এটি করতে, setUpMaps
পদ্ধতিতে নেভিগেট করুন এবং mapFragment.getMapAsync
কলের ভিতরে, googleMap.isMyLocationEnabled
কে true.
এটি করলে মানচিত্রে নীল বিন্দু দেখাবে।
private fun setUpMaps() {
mapFragment.getMapAsync { googleMap ->
googleMap.isMyLocationEnabled = true
// ...
}
}
বর্তমান অবস্থান পান
ডিভাইসের অবস্থান পেতে, আপনাকে FusedLocationProviderClient
ক্লাস ব্যবহার করতে হবে। এর একটি উদাহরণ প্রাপ্ত করা ইতিমধ্যেই onCreate
MainActivity
করা হয়েছে। এই বস্তুটি ব্যবহার করতে, getCurrentLocation
পদ্ধতিটি পূরণ করুন, যা একটি ল্যাম্বডা যুক্তি গ্রহণ করে যাতে একটি অবস্থান এই পদ্ধতির কলারের কাছে প্রেরণ করা যায়।
এই পদ্ধতিটি সম্পূর্ণ করার জন্য, আপনি lastLocation
অবজেক্টের শেষ FusedLocationProviderClient
বৈশিষ্ট্যটি অ্যাক্সেস করতে পারেন এবং তারপরে একটি addOnSuccessListener
যোগ করে যেমন:
fusedLocationClient.lastLocation.addOnSuccessListener { location ->
currentLocation = location
onSuccess(location)
}.addOnFailureListener {
Log.e(TAG, "Could not get location")
}
getCurrentLocation
পদ্ধতিটি setUpMaps
পদ্ধতিতে getMapAsync
এ প্রদত্ত ল্যাম্বডা থেকে কল করা হয় যেখান থেকে কাছাকাছি স্থানগুলি আনা হয়।
নেটওয়ার্ক কল শুরু করুন
getNearbyPlaces
পদ্ধতি কলে, লক্ষ্য করুন যে নিম্নলিখিত পরামিতিগুলি placesServices.nearbyPlaces
পদ্ধতিতে পাস করা হয়েছে—একটি API কী, ডিভাইসের অবস্থান, মিটারের একটি ব্যাসার্ধ (যা 2 কিমিতে সেট করা আছে), এবং একটি স্থানের ধরন (বর্তমানে সেট করা আছে) park
করতে)
val apiKey = "YOUR API KEY"
placesService.nearbyPlaces(
apiKey = apiKey,
location = "${location.latitude},${location.longitude}",
radiusInMeters = 2000,
placeType = "park"
)
নেটওয়ার্ক কল সম্পূর্ণ করতে, এগিয়ে যান এবং API কীটি পাস করুন যা আপনি আপনার gradle.properties
ফাইলে সংজ্ঞায়িত করেছেন। নিম্নলিখিত কোড স্নিপেটটি আপনার build.gradle
ফাইলে android > defaultConfig কনফিগারেশনের অধীনে সংজ্ঞায়িত করা হয়েছে:
android {
defaultConfig {
resValue "string", "google_maps_key", (project.findProperty("GOOGLE_MAPS_API_KEY") ?: "")
}
}
এটি বিল্ড টাইমে স্ট্রিং রিসোর্স মান google_maps_key
উপলব্ধ করবে।
নেটওয়ার্ক কলটি সম্পূর্ণ করতে, আপনি Context
অবজেক্টে getString
এর মাধ্যমে এই স্ট্রিং রিসোর্সটি পড়তে পারেন।
val apiKey = this.getString(R.string.google_maps_key)
7. AR-তে স্থান
এখন পর্যন্ত, আপনি নিম্নলিখিত কাজ করেছেন:
- প্রথমবার অ্যাপটি চালানোর সময় ব্যবহারকারীর কাছ থেকে ক্যামেরা এবং অবস্থানের অনুমতির অনুরোধ করা হয়েছে
- অনুভূমিক প্লেন ট্র্যাকিং শুরু করতে ARCore সেট আপ করুন
- আপনার API কী দিয়ে মানচিত্র SDK সেট আপ করুন৷
- ডিভাইসের বর্তমান অবস্থান পেয়েছেন
- Places API ব্যবহার করে কাছাকাছি স্থানগুলি (বিশেষভাবে পার্ক) আনা হয়েছে৷
এই অনুশীলনটি সম্পূর্ণ করার অবশিষ্ট ধাপটি হল আপনি যে স্থানগুলিকে বর্ধিত বাস্তবতায় আনছেন সেগুলিকে অবস্থান করা।
দৃশ্য বোঝা
ARCore প্রতিটি ছবির ফ্রেমে ফিচার পয়েন্ট নামে পরিচিত আকর্ষণীয় এবং স্বতন্ত্র পয়েন্ট সনাক্ত করে ডিভাইসের ক্যামেরার মাধ্যমে বাস্তব-বিশ্বের দৃশ্য বুঝতে সক্ষম। যখন এই বৈশিষ্ট্য পয়েন্টগুলি ক্লাস্টার করা হয় এবং টেবিল এবং মেঝেগুলির মতো একটি সাধারণ অনুভূমিক সমতলে পড়ে থাকে, তখন ARCore এই বৈশিষ্ট্যটিকে একটি অনুভূমিক সমতল হিসাবে অ্যাপে উপলব্ধ করতে পারে।
যেমন আপনি আগে দেখেছেন, ARCore সাদা বিন্দু প্রদর্শন করে একটি প্লেন সনাক্ত করা হলে ব্যবহারকারীকে গাইড করতে সহায়তা করে।
অ্যাঙ্কর যোগ করা হচ্ছে
একবার একটি প্লেন সনাক্ত করা হলে, আপনি একটি অ্যাঙ্কর নামক একটি বস্তু সংযুক্ত করতে সক্ষম হবেন। একটি নোঙ্গরের মাধ্যমে, আপনি ভার্চুয়াল বস্তু স্থাপন করতে পারেন এবং গ্যারান্টি দিতে পারেন যে সেই বস্তুগুলি মহাকাশে একই অবস্থানে থাকবে বলে মনে হবে। এগিয়ে যান এবং একটি প্লেন সনাক্ত করা হলে একটি সংযুক্ত করতে কোড পরিবর্তন করুন।
setUpAr
এ, একটি OnTapArPlaneListener
PlacesArFragment
সাথে সংযুক্ত থাকে। যখনই AR দৃশ্যে একটি প্লেন ট্যাপ করা হয় তখন এই শ্রোতাকে আমন্ত্রণ জানানো হয়। এই কলের মধ্যে, আপনি HitResult
AnchorNode
একটি Anchor
এবং একটি অ্যাঙ্করনোড তৈরি করতে পারেন:
arFragment.setOnTapArPlaneListener { hitResult, _, _ ->
val anchor = hitResult.createAnchor()
anchorNode = AnchorNode(anchor)
anchorNode?.setParent(arFragment.arSceneView.scene)
addPlaces(anchorNode!!)
}
AnchorNode
হল যেখানে আপনি চাইল্ড নোড অবজেক্টগুলি সংযুক্ত PlaceNode
ইনস্ট্যান্সগুলি- যে দৃশ্যটি addPlaces
মেথড কলে পরিচালনা করা হয়।
চালাও এটা
আপনি যদি উপরের পরিবর্তনগুলি সহ অ্যাপটি চালান, একটি প্লেন সনাক্ত না হওয়া পর্যন্ত আপনার চারপাশে তাকান। এগিয়ে যান এবং সাদা বিন্দুতে আলতো চাপুন যা একটি সমতল নির্দেশ করে। এটি করার পরে, আপনি এখন আপনার চারপাশের সমস্ত নিকটতম পার্কগুলির জন্য মানচিত্রে চিহ্নিতকারীগুলি দেখতে পাবেন৷ যাইহোক, আপনি যদি লক্ষ্য করেন, ভার্চুয়াল অবজেক্টগুলি তৈরি করা নোঙ্গরের উপর আটকে আছে এবং সেই পার্কগুলি যেখানে মহাকাশে রয়েছে তার তুলনায় স্থাপন করা হয়নি।
আপনার শেষ ধাপের জন্য, আপনি ডিভাইসে Android ইউটিলিটি লাইব্রেরির জন্য Maps SDK এবং সেন্সর ম্যানেজার ব্যবহার করে এটি সংশোধন করবেন।
8. অবস্থানের স্থান
একটি সঠিক শিরোনামে অগমেন্টেড রিয়েলিটিতে ভার্চুয়াল প্লেস আইকন স্থাপন করতে, আপনার দুটি তথ্যের প্রয়োজন হবে:
- যেখানে সত্য উত্তর
- উত্তর এবং প্রতিটি স্থানের মধ্যে কোণ
উত্তর নির্ধারণ করা
ডিভাইসে উপলব্ধ অবস্থান সেন্সর (জিওম্যাগনেটিক এবং অ্যাক্সিলোমিটার) ব্যবহার করে উত্তর নির্ধারণ করা যেতে পারে। এই দুটি সেন্সর ব্যবহার করে, আপনি মহাকাশে ডিভাইসের অবস্থান সম্পর্কে রিয়েল-টাইম তথ্য সংগ্রহ করতে পারেন। অবস্থান সেন্সর সম্পর্কে আরও তথ্যের জন্য, ডিভাইসের অভিযোজন গণনা পড়ুন।
এই সেন্সরগুলি অ্যাক্সেস করার জন্য, আপনাকে একটি সেন্সর SensorEventListener
SensorManager
করতে হবে৷ MainActivity
এর জীবনচক্র পদ্ধতিতে এই পদক্ষেপগুলি ইতিমধ্যেই আপনার জন্য করা হয়েছে:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ...
sensorManager = getSystemService()!!
// ...
}
override fun onResume() {
super.onResume()
sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)?.also {
sensorManager.registerListener(
this,
it,
SensorManager.SENSOR_DELAY_NORMAL
)
}
sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)?.also {
sensorManager.registerListener(
this,
it,
SensorManager.SENSOR_DELAY_NORMAL
)
}
}
override fun onPause() {
super.onPause()
sensorManager.unregisterListener(this)
}
onSensorChanged
পদ্ধতিতে, একটি SensorEvent
অবজেক্ট প্রদান করা হয়, যা সময়ের সাথে সাথে পরিবর্তিত হওয়ার সাথে সাথে প্রদত্ত সেন্সরের ডেটাম সম্পর্কে বিশদ বিবরণ ধারণ করে। এগিয়ে যান এবং সেই পদ্ধতিতে নিম্নলিখিত কোড যোগ করুন:
override fun onSensorChanged(event: SensorEvent?) {
if (event == null) {
return
}
if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) {
System.arraycopy(event.values, 0, accelerometerReading, 0, accelerometerReading.size)
} else if (event.sensor.type == Sensor.TYPE_MAGNETIC_FIELD) {
System.arraycopy(event.values, 0, magnetometerReading, 0, magnetometerReading.size)
}
// Update rotation matrix, which is needed to update orientation angles.
SensorManager.getRotationMatrix(
rotationMatrix,
null,
accelerometerReading,
magnetometerReading
)
SensorManager.getOrientation(rotationMatrix, orientationAngles)
}
উপরের কোডটি সেন্সরের ধরন পরীক্ষা করে এবং প্রকারের উপর নির্ভর করে উপযুক্ত সেন্সর রিডিং আপডেট করবে (হয় অ্যাক্সিলোমিটার বা ম্যাগনেটোমিটার রিডিং)। এই সেন্সর রিডিংগুলি ব্যবহার করে, ডিভাইসের সাপেক্ষে উত্তর থেকে কত ডিগ্রির মান এখন নির্ধারণ করা যেতে পারে (অর্থাৎ orientationAngles[0]
)।
গোলাকার শিরোনাম
এখন যে উত্তর নির্ধারণ করা হয়েছে, পরবর্তী পদক্ষেপটি হল উত্তর এবং প্রতিটি স্থানের মধ্যে কোণ নির্ধারণ করা এবং সেই তথ্য ব্যবহার করে স্থানগুলিকে অগমেন্টেড বাস্তবতায় সঠিক শিরোনামে অবস্থান করা।
শিরোনাম গণনা করতে, আপনি Android ইউটিলিটি লাইব্রেরির জন্য মানচিত্র SDK ব্যবহার করবেন, যাতে গোলাকার জ্যামিতির মাধ্যমে দূরত্ব এবং শিরোনামগুলি গণনা করার জন্য কয়েকটি সহায়ক ফাংশন রয়েছে৷ আরও তথ্যের জন্য, লাইব্রেরির এই ওভারভিউ পড়ুন।
এরপরে, আপনি ইউটিলিটি লাইব্রেরিতে sphericalHeading
হেডিং পদ্ধতি ব্যবহার করবেন, যা দুটি LatLng
বস্তুর মধ্যে শিরোনাম/বিয়ারিং গণনা করে। এই তথ্যটি Place.kt
এ সংজ্ঞায়িত getPositionVector
পদ্ধতির ভিতরে প্রয়োজন। এই পদ্ধতিটি শেষ পর্যন্ত একটি Vector3
অবজেক্ট ফিরিয়ে দেবে, যা প্রতিটি PlaceNode
AR স্পেসে স্থানীয় অবস্থান হিসাবে ব্যবহার করবে।
এগিয়ে যান এবং সেই পদ্ধতিতে শিরোনাম সংজ্ঞাটি নিম্নলিখিতগুলির সাথে প্রতিস্থাপন করুন:
val heading = latLng.sphericalHeading(placeLatLng)
এটি করার ফলে নিম্নলিখিত পদ্ধতির সংজ্ঞা পাওয়া উচিত:
fun Place.getPositionVector(azimuth: Float, latLng: LatLng): Vector3 {
val placeLatLng = this.geometry.location.latLng
val heading = latLng.sphericalHeading(placeLatLng)
val r = -2f
val x = r * sin(azimuth + heading).toFloat()
val y = 1f
val z = r * cos(azimuth + heading).toFloat()
return Vector3(x, y, z)
}
স্থানীয় অবস্থান
AR-তে স্থানগুলিকে সঠিকভাবে নির্দেশ করার শেষ ধাপ হল getPositionVector
এর ফলাফল ব্যবহার করা যখন PlaceNode
অবজেক্টগুলি দৃশ্যে যোগ করা হচ্ছে। এগিয়ে যান এবং MainActivity
এ addPlaces
এ নেভিগেট করুন, লাইনের ঠিক নীচে যেখানে প্যারেন্ট প্রতিটি placeNode
এ সেট করা আছে (ঠিক নীচে placeNode.setParent(anchorNode)
)। placeNode
কল getPositionVector
ফলে localPosition
এর লোকাল পজিশন সেট করুন:
val placeNode = PlaceNode(this, place)
placeNode.setParent(anchorNode)
placeNode.localPosition = place.getPositionVector(orientationAngles[0], currentLocation.latLng)
ডিফল্টরূপে, getPositionVector
getPositionVector
y
মান দ্বারা নির্দিষ্ট করা হিসাবে নোডের y দূরত্ব 1 মিটারে সেট করে। আপনি যদি এই দূরত্ব সামঞ্জস্য করতে চান, 2 মিটার বলুন, এগিয়ে যান এবং প্রয়োজন অনুসারে সেই মানটি পরিবর্তন করুন৷
এই পরিবর্তনের সাথে, যোগ করা PlaceNode
অবজেক্টগুলি এখন সঠিক শিরোনামে ভিত্তিক হওয়া উচিত। এখন এগিয়ে যান এবং ফলাফল দেখতে অ্যাপ চালান!
9. অভিনন্দন
এই পর্যন্ত পাওয়ার জন্য অভিনন্দন!