একটি দৃশ্য তৈরি করুন এবং ইন্টারঅ্যাক্ট করুন

এই পৃষ্ঠায় একটি Scene নির্মাণ এবং এর সাথে ইন্টারঅ্যাক্ট করার জন্য সাধারণ টিপস রয়েছে৷

AR ছাড়া একটি দৃশ্য রেন্ডার করুন

SceneView ক্লাস আপনাকে ডিভাইসের ক্যামেরা বা একটি AR সেশনের প্রয়োজন ছাড়াই একটি 3D দৃশ্য রেন্ডার করতে দেয়। এটি AR ছাড়া আপনার অ্যাপে 3D অবজেক্টের প্রিভিউ দেখার জন্য বা AR সমর্থন করে না এমন ডিভাইসগুলিতে বিকল্প কার্যকারিতা প্রদানের জন্য দরকারী।

ডিফল্টরূপে, SceneView AR ক্যামেরা থেকে ছবি প্রদর্শন করে না এবং একটি কালো পটভূমি ব্যবহার করে। পটভূমির রঙ পরিবর্তন করতে, আপনি হয় view.setBackgroundColor() কল করতে পারেন বা নীচের চিত্রের মতো লেআউটে একটি পটভূমির রঙ নির্ধারণ করতে পারেন:

<com.google.ar.sceneform.SceneView
    android:id="@+id/scene_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/deep_teal"/>

দৃশ্যের Camera নোডটি মূলে (অবস্থান 0,0,0) এবং সামনের দিকে (দিক 0,0,-1) স্থাপন করা হয়েছে। কারণ ক্যামেরার অবস্থান এবং ঘূর্ণন AR মোশন ট্র্যাকিংয়ের সাথে আবদ্ধ নয়, আপনি অন্য যেকোন নোডের মতো এটিকে পুনঃস্থাপন বা অ্যানিমেট করতে পারেন।

Camera camera = sceneView.getScene().getCamera();
camera.setLocalRotation(Quaternion.axisAngle(Vector3.right(), -30.0f));

মিথস্ক্রিয়া

ব্যবহারকারী স্পর্শ হ্যান্ডেল

ব্যবহারকারী যখন স্ক্রীন স্পর্শ করে, তখন সিনফর্ম স্পর্শ ইভেন্টটি ইভেন্ট হ্যান্ডলার এবং নোড এবং দৃশ্যের সাথে সংযুক্ত শ্রোতাদের কাছে প্রচার করে। এই আচরণটি স্পর্শ ইভেন্টগুলি কীভাবে Android-এ ভিউ এবং ভিউ গ্রুপগুলিতে প্রচার করে তার অনুরূপ। এখানে প্রচারের ক্রম:

  1. ইভেন্টটি scene.addOnPeekTouchListener() এ যোগ করা যেকোনো শ্রোতার কাছে পাঠানো হয়

    এটি viewGroup.intercept() এর মতই, ব্যতীত যে দৃশ্যের অন পিক টাচ শ্রোতা ঘটনাটি গ্রাস করতে পারে না।

  2. ঘটনাটি প্রথম নোডে প্রেরণ করা হয় যার সাথে রশ্মি ছেদ করে।

    • নোড একটি onTouchEvent() মেথড সেট সংজ্ঞায়িত করে ইভেন্টটি গ্রাস করতে পারে যা true ফেরত দেয়।
    • যদি onTouchEvent() পদ্ধতি false রিটার্ন করে, বা কোন শ্রোতা সংজ্ঞায়িত না হয়, ইভেন্টটি নোডের অভিভাবকের কাছে প্রচার করা হয়। ঘটনাটি গ্রাস না হওয়া পর্যন্ত বা দৃশ্যে পৌঁছানো পর্যন্ত এই প্রক্রিয়া চলতে থাকে।
  3. অবশেষে, যদি কোনো শ্রোতা ইভেন্টটি উপভোগ না করে, ইভেন্টটি scene.onTouchListener() এ চলে যায়।

অঙ্গভঙ্গি সনাক্ত

ArFragment ট্যাপ (নির্বাচন), টেনে (সরানো), চিমটি (স্কেল), এবং টুইস্ট (ঘোরানো) অঙ্গভঙ্গিগুলির জন্য সমর্থনে তৈরি করেছে।

উদাহরণস্বরূপ, HelloSceneform নমুনা অ্যাপে HelloSceneformActivity.java দেখুন।

কাস্টম নোড তৈরি করুন

কাস্টম অ্যান্ড্রয়েড ভিউ তৈরি করার মতো, আপনি নোড সাবক্লাস করে কাস্টম Node তৈরি করতে পারেন। এখানে কিছু পরিস্থিতি রয়েছে যখন আপনি একটি কাস্টম নোড তৈরি করতে চাইতে পারেন:

  • আপনি নোড লাইফসাইকেলে ইভেন্টগুলি অ্যাক্সেস করতে চান, যেমন onUpdate() , onActivate , এবং onDeactivate()
  • আপনি একটি নোড তৈরি করতে চান যা নোডের একটি গ্রুপের সমন্বয়ে গঠিত।
  • আপনি অনেক কোড সদৃশ করছেন, এবং এটি একটি সাবক্লাসে ফ্যাক্টর করতে পারেন।

উদাহরণের জন্য, সৌরজগতের নমুনা অ্যাপে Planet.java দেখুন।

অ্যানিমেট নোড

নোড অ্যানিমেট করার দুটি উপায় আছে:

  • স্ট্যান্ডার্ড অ্যান্ড্রয়েড অ্যানিমেশন API থেকে ObjectAnimator ব্যবহার করুন।
  • একটি কাস্টম নোড ক্লাস তৈরি করুন এবং onUpdate() ওভাররাইড করুন

ObjectAnimator দিয়ে অ্যানিমেট করুন

এখানে একটি উদাহরণ যা একটি স্পটলাইটের তীব্রতাকে অ্যানিমেট করে:

final int durationInMilliseconds = 1000;
final float minimumIntensity = 1000.0f;
final float maximumIntensity = 3000.0f;
ValueAnimator intensityAnimator =
    ObjectAnimator.ofFloat(
        spotlightNode.getLight(), "intensity", minimumIntensity, maximumIntensity);
intensityAnimator.setDuration(durationInMilliseconds);
intensityAnimator.setRepeatCount(ValueAnimator.INFINITE);
intensityAnimator.setRepeatMode(ValueAnimator.REVERSE);
intensityAnimator.start();

আরও তথ্যের জন্য, অবজেক্ট অ্যানিমেটরের সাথে অ্যানিমেটিং দেখুন।

onUpdate এ অ্যানিমেট করুন

ফ্রেম টু ফ্রেমে অ্যানিমেট করতে নোডের onUpdate() ওভাররাইড করুন। নিম্নলিখিত উদাহরণ, সৌরজগতের নমুনা অ্যাপের Planet.java থেকে, ব্যবহারকারীর মুখোমুখি হওয়ার জন্য প্রতিটি ফ্রেমে ইনফোকার্ড সামঞ্জস্য করে, এমনকি গ্রহটি ঘোরার সময়ও।

@Override
public void onUpdate(FrameTime frameTime) {
  Vector3 cameraPosition = getScene().getCamera().getWorldPosition();
  Vector3 cardPosition = infoCard.getWorldPosition();
  Vector3 direction = Vector3.subtract(cameraPosition, cardPosition);
  Quaternion lookRotation = Quaternion.lookRotation(direction, Vector3.up());
  infoCard.setWorldRotation(lookRotation);
}

লাইট যোগ করুন

দৃশ্যের যেকোনো নোডের সাথে Lights সংযুক্ত করা যেতে পারে। ডিফল্টরূপে, প্রতিটি সিনফর্ম দৃশ্যে একটি Sun নোড অন্তর্ভুক্ত থাকে, যার একটি দিকনির্দেশক আলো সংযুক্ত থাকে।

আপনি সূর্য পরিবর্তন করতে পারেন বা একটি দৃশ্যে আপনার নিজস্ব আলো যোগ করতে পারেন। নিম্নলিখিত উদাহরণ একটি স্পটলাইট যোগ করে:

Light spotLightYellow =
    Light.builder(this, Light.Type.FOCUSED_SPOTLIGHT)
        .setColor(new Color(android.graphics.Color.YELLOW))
        .setShadowCastingEnabled(true)
        .build();

তারপর setLight() কে নোডের সাথে সংযুক্ত করতে কল করুন।

প্লেন ভিজ্যুয়ালাইজেশন কাস্টমাইজ করুন

ডিফল্টরূপে, দৃশ্যটিতে একটি PlaneRenderer রয়েছে যা Planes দ্বারা শনাক্ত করা হলে বিমানগুলিকে হাইলাইট করে৷ এটি এই মত দেখায়:

আপনি সনাক্ত করা প্লেন রেন্ডার করতে ব্যবহৃত ডিফল্ট উপাদান এবং টেক্সচার পরিবর্তন করতে পারেন। টেক্সচারটি কীভাবে পরিবর্তন করবেন তা এখানে:

Texture.Sampler sampler =
        Texture.Sampler.builder()
                .setMinFilter(Texture.Sampler.MinFilter.LINEAR)
                .setWrapMode(Texture.Sampler.WrapMode.REPEAT)
                .build();

// R.drawable.custom_texture is a .png file in src/main/res/drawable
Texture.builder()
        .setSource(this, R.drawable.custom_texture)
        .setSampler(sampler)
        .build()
        .thenAccept(texture -> {
          arSceneView.getPlaneRenderer()
                  .getMaterial().thenAccept(material ->
                  material.setTexture(PlaneRenderer.MATERIAL_TEXTURE, texture));
        });

ছায়া

ছায়াগুলি রেন্ডারেবলগুলিকে বিশ্বে ভিত্তি করে দেখায় এবং ব্যবহারকারীদের গভীরতা এবং স্থানের ধারনা দেয়৷

সিনফর্মে, এমন কিছু বস্তু রয়েছে যা ছায়া নিক্ষেপ করতে পারে এবং এমন বস্তু রয়েছে যা ছায়া গ্রহণ করতে পারে।

  • Lights এবং Renderables ছায়া নিক্ষেপ করতে পারেন

    ডিফল্টরূপে, ছায়া ঢালাই সূর্যের উপর সক্ষম, কিন্তু আলোর জন্য নয়। এটি চালু করতে setShadowCastingEnabled() এ কল করুন।

  • Renderables এবং PlaneRenderer ছায়া পেতে পারে।

    ডিফল্টরূপে, ছায়া গ্রহণ সক্রিয় করা হয়। এটি বন্ধ করতে setShadowReceiver() কে কল করুন।

যদি একটি রেন্ডারযোগ্য উভয়ই ছায়া দেয় এবং গ্রহণ করে তবে এটি নিজের উপর ছায়া ফেলতে পারে।