অ্যান্ড্রয়েডে GAME ROTATION VECTOR সেন্সর সাপোর্ট যাচাই
এই টিউটোরিয়ালে শিখব কিভাবে গেম রোটেশন ভেক্টর সেন্সর (Sensor.TYPE_GAME_ROTATION_VECTOR) ডিভাইসে উপলব্ধ কিনা তা যাচাই করতে হয়। এটি ম্যাগনেটোমিটার ছাড়া ওরিয়েন্টেশন প্রদান করে, গেমিং-এর জন্য আদর্শ।
প্রয়োজনীয় ধাপসমূহ
ধাপ ১: নতুন প্রজেক্ট তৈরি করুন
Android Studio-তে File → New Project নির্বাচন করে প্রজেক্ট তৈরি করুন।
ধাপ ২: লেআউট ফাইল
res/layout/activity_main.xml ফাইলে:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:gravity="center"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<TextView
android:id="@+id/actionEvent"
android:textSize="40sp"
android:layout_marginTop="30dp"
android:layout_width="wrap_content"
android:layout_height="match_parent" />
</LinearLayout>
ধাপ ৩: জাভা কোড
src/MainActivity.java ফাইলে:
package com.example.myapplication;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private SensorManager sensorManager;
TextView actionEvent;
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
actionEvent = findViewById(R.id.actionEvent);
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// GAME ROTATION VECTOR সেন্সর যাচাই (API 18+)
Sensor gameRotationSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR);
if (gameRotationSensor != null) {
actionEvent.setText("✓ GAME ROTATION VECTOR সমর্থিত\n" +
"নাম: " + gameRotationSensor.getName() + "\n" +
"টাইপ: সফ্টওয়্যার (জাইরো + এক্সিলারোমিটার ফিউশন)\n" +
"ম্যাগনেটোমিটার ব্যবহার করে না\n" +
"পাওয়ার: " + gameRotationSensor.getPower() + " mA");
} else {
actionEvent.setText("✗ GAME ROTATION VECTOR সমর্থিত নয়");
}
}
}
GAME ROTATION VECTOR কী?
| বিষয় | বিস্তারিত |
|---|---|
| সেন্সর টাইপ | Sensor.TYPE_GAME_ROTATION_VECTOR |
| API লেভেল | 18 (Android 4.3 Jelly Bean MR2) |
| প্রকার | সফ্টওয়্যার/ভার্চুয়াল সেন্সর |
| ডেটা সোর্স | জাইরোস্কোপ + এক্সিলারোমিটার (সেন্সর ফিউশন) |
| ম্যাগনেটোমিটার | ব্যবহার করে না (ম্যাগনেটিক ইন্টারফারেন্স মুক্ত) |
| আউটপুট | কোয়াটার্নিয়ন (Quaternion) - 4 মান (x, y, z, w) |
GAME ROTATION VECTOR vs ROTATION VECTOR
| বৈশিষ্ট্য | TYPE_ROTATION_VECTOR | TYPE_GAME_ROTATION_VECTOR |
|---|---|---|
| ম্যাগনেটোমিটার | ব্যবহার করে (অবсолют উত্তর জানায়) | ব্যবহার করে না |
| ড্রিফট | কম (ম্যাগনেটোমিটার করেক্ট করে) | জাইরো ড্রিফট থাকে (yaw-এ) |
| গেমিং উপযোগিতা | ম্যাগনেটিক ইন্টারফারেন্সে সমস্যা | সর্বোত্তম (স্মুথ, লেটেন্সি কম) |
| ব্যাটারি | আরো খরচ (৩টি সেন্সর) | কম (২টি সেন্সর) |
কোয়াটার্নিয়ন ডেটা পড়া
SensorEventListener listener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
// event.values: [x, y, z, w] - কোয়াটার্নিয়ন কম্পোনেন্ট
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
float w = event.values[3];
// অয়লার কোণে কনভার্ট (যদি দরকার হয়)
// pitch, roll, yaw = quaternionToEuler(x, y, z, w)
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
};
কোয়াটার্নিয়ন থেকে অয়লার কোণ
public float[] quaternionToEuler(float x, float y, float z, float w) {
float[] euler = new float[3];
// Roll (x-axis rotation)
double sinr_cosp = 2 * (w * x + y * z);
double cosr_cosp = 1 - 2 * (x * x + y * y);
euler[0] = (float) Math.atan2(sinr_cosp, cosr_cosp);
// Pitch (y-axis rotation)
double sinp = 2 * (w * y - z * x);
euler[1] = (float) (Math.abs(sinp) >= 1 ? Math.copySign(Math.PI/2, sinp) : Math.asin(sinp));
// Yaw (z-axis rotation)
double siny_cosp = 2 * (w * z + x * y);
double cosy_cosp = 1 - 2 * (y * y + z * z);
euler[2] = (float) Math.atan2(siny_cosp, cosy_cosp);
return euler; // [roll, pitch, yaw] রেডিয়ানে
}
ব্যবহারের ক্ষেত্র
- মোবাইল গেমিং (FPS, রেসিং, ফ্লাইট সিম)
- VR হেড ট্র্যাকিং (ম্যাগনেটোমিটার-মুক্ত)
- AR অ্যাপ্লিকেশন (ইন্ডোরে ভালো কাজ করে)
- রোবটিক্স/ড্রোন কন্ট্রোল (ফোন দিয়ে)
অ্যাপ্লিকেশন চালানো
রান করলে জাইরোস্কোপ সহ ডিভাইসে "✓ GAME ROTATION VECTOR সমর্থিত" দেখাবে। জাইরোস্কোপ ছাড়া ফোনে এটি থাকবে না।
লক্ষ্য করুন
- জাইরোস্কোপ থাকা বাধ্যতা (ফিউশনের জন্য)
- Yaw ড্রিফট হলে প্রতি সেকেন্ডে ~1-2 ডিগ্রি ভুল হতে পারে
- গেমে periódicos রি-সেন্ট্রিং ফিচার যোগ করুন