কম্পিউটার টিউটোরিয়াল

অ্যান্ড্রয়েডে GAME ROTATION VECTOR সেন্সর সাপোর্ট যাচাই

অ্যান্ড্রয়েডে 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_VECTORTYPE_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 রি-সেন্ট্রিং ফিচার যোগ করুন
  1. অ্যান্ড্রয়েড মোবাইল প্রেশার সেন্সর সাপোর্ট যাচাই

  2. অ্যান্ড্রয়েডে বর্তমান Wi-Fi 5 GHz ব্যান্ড সমর্থন করে কিনা যাচাই করুন

  3. অ্যান্ড্রয়েডে Wi-Fi সবসময় আবিষ্কারযোগ্য (Discoverable) কিনা যাচাই করুন

  4. অ্যান্ড্রয়েডে চলমান অ্যাপ্লিকেশন তালিকা পাওয়ার উপায়