একটি Renderable তৈরি করুন

একটি Renderable হল একটি 3D মডেল এবং শীর্ষবিন্দু, উপকরণ, টেক্সচার এবং আরও অনেক কিছু নিয়ে গঠিত। এটি একটি Node সাথে সংযুক্ত করা যেতে পারে এবং একটি দৃশ্যের অংশ হিসাবে রেন্ডার করা যেতে পারে। এই পৃষ্ঠাটি বর্ণনা করে যে কিভাবে Renderable s তৈরি এবং পরিবর্তন করতে হয়।

অ্যান্ড্রয়েড উইজেট থেকে তৈরি করুন

আপনি স্ট্যান্ডার্ড অ্যান্ড্রয়েড উইজেট থেকে একটি ViewRenderable তৈরি করতে পারেন। এই দৃশ্যে ফ্ল্যাট কার্ড হিসাবে রেন্ডার করা হয়.

একটি তৈরি করতে:

  1. res > লেআউটে একটি লেআউট ফাইল তৈরি করুন। উদাহরণ স্বরূপ:

    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
       android:id="@+id/planetInfoCard"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_weight="1"
       android:background="@drawable/rounded_bg"
       android:gravity="center"
       android:orientation="vertical"
       android:padding="6dp"
       android:text="Test"
       android:textAlignment="center" />
    
  2. ViewRenderable তৈরি করুন।

    ViewRenderable.builder()
        .setView(this, R.layout.test_view)
        .build()
        .thenAccept(renderable -> testViewRenderable = renderable);
    

    setView() এর এই সংস্করণটি uninflated লেআউট ফাইলের রিসোর্স আইডি নেয়। আপনি প্রোগ্রামে তৈরি ভিউ থেকে রেন্ডারযোগ্য তৈরি করতে setView(View) কল করতে পারেন।

Sceneform-এর সমস্ত build() পদ্ধতি একটি CompletableFuture Future প্রদান করে। বস্তুটি একটি পৃথক থ্রেডে নির্মিত এবং কলব্যাক ফাংশনটি মূল থ্রেডে কার্যকর করা হয়।

রেন্ডারেবলের আকার View অবজেক্টের আকারের উপর ভিত্তি করে। ডিফল্টরূপে, দৃশ্যের জন্য প্রতি 250dp রেন্ডারেবলের জন্য 1 মিটার হয়ে যায়। ভিউয়ের আকার কীভাবে গণনা করা হয় তা পরিবর্তন করতে setSizer(ViewSizer) ব্যবহার করুন।

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

// update button text when the renderable's node is tapped
Button button = (Button) renderable.getView();
button.setOnClickListener((button) -> button.setText("clicked"));

একটি 3D সম্পদ থেকে তৈরি করুন

Sceneform 3D অ্যাসেট ফাইল (OBJ, FBX, glTF) কে Sceneform বাইনারি অ্যাসেট (SFB) তে রূপান্তর করার জন্য টুল এবং প্লাগইন প্রদান করে, যেগুলিকে একটি ModelRenderable তৈরি করা যেতে পারে।

আরও তথ্যের জন্য, 3D সম্পদ আমদানি এবং পূর্বরূপ দেখুন।

রানটাইমে সহজ আকার তৈরি করুন

ShapeFactory এবং MaterialFactory ব্যবহার করে কিউব, গোলক এবং সিলিন্ডারের মতো সাধারণ আকারগুলি তৈরি করা যেতে পারে যা আপনাকে সাধারণ আকার এবং উপকরণ থেকে রেন্ডারযোগ্য বস্তু তৈরি করতে দেয়।

এখানে কিভাবে একটি লাল গোলক তৈরি করতে হয়:

MaterialFactory.makeOpaqueWithColor(this, new Color(android.graphics.Color.RED))
        .thenAccept(
            material -> {
              redSphereRenderable =
                  ShapeFactory.makeSphere(0.1f, new Vector3(0.0f, 0.15f, 0.0f), material); });

রানটাইমে 3D মডেল লোড করুন

glTF বা glb ফাইল হিসাবে সংরক্ষিত 3D মডেলগুলি রূপান্তর ছাড়াই রানটাইমে লোড করা যেতে পারে। এটি আপনার অ্যাপ্লিকেশনে রেন্ডার করা মডেলগুলির নমনীয়তাকে ব্যাপকভাবে উন্নত করে, কিন্তু ট্রেড-অফ হল মডেলটি রানটাইমে পড়া হয় এবং sfb এ বিল্ড টাইম রূপান্তরের সময় করা অপ্টিমাইজেশান থেকে উপকৃত হয় না। এই কারণে, এটি সুপারিশ করা হয় যে আপনি আপনার অ্যাপ্লিকেশন এবং 3D মডেলগুলি বিস্তৃত ডিভাইস এবং নেটওয়ার্ক অবস্থার উপর পরীক্ষা করুন যাতে আপনার ব্যবহারকারীদের একটি দুর্দান্ত অভিজ্ঞতা রয়েছে।

রানটাইম অ্যাসেট লোডিং ব্যবহার করার জন্য আপনাকে app/build.gradle এ অ্যাসেট লাইব্রেরির উপর নির্ভরতা যোগ করতে হবে:

  dependencies {
     implementation 'com.google.ar.sceneform:assets:1.15.0'
  }

RenderableSource ক্লাস glTF ফাইল লোড করা এবং ModelRenderable.Builder এর জন্য একটি সোর্স অবজেক্ট তৈরি করে যা ModelRenderable.Builder অবজেক্ট তৈরি করে।

উদাহরণস্বরূপ, ইন্টারনেট থেকে একটি মডেল লোড করা এই মত দেখায়:

 private static final String GLTF_ASSET =
   "https://github.com/KhronosGroup/glTF-Sample-Models/raw/master/2.0/Duck/glTF/Duck.gltf";

 /* When you build a Renderable, Sceneform loads model and related resources
 * in the background while returning a CompletableFuture.
 * Call thenAccept(), handle(), or check isDone() before calling get().
 */
 ModelRenderable.builder()
    .setSource(this, RenderableSource.builder().setSource(
            this,
            Uri.parse(GLTF_ASSET),
            RenderableSource.SourceType.GLTF2)
            .setScale(0.5f)  // Scale the original model to 50%.
            .setRecenterMode(RenderableSource.RecenterMode.ROOT)
            .build())
    .setRegistryId(GLTF_ASSET)
    .build()
    .thenAccept(renderable -> duckRenderable = renderable)
    .exceptionally(
        throwable -> {
          Toast toast =
              Toast.makeText(this, "Unable to load renderable " +
              GLTF_ASSET, Toast.LENGTH_LONG);
          toast.setGravity(Gravity.CENTER, 0, 0);
          toast.show();
          return null;
        });

দ্রষ্টব্য : রিমোটলি রিসোর্স অ্যাক্সেস করার জন্য, আপনাকে আপনার AndroidManifest.xml-এ ইন্টারনেট অনুমতি অন্তর্ভুক্ত করতে হবে:

    <manifest …>
      <!-- Needed to load a glTF from the internet. -->
        <uses-permission android:name="android.permission.INTERNET"/>

    </manifest>

রানটাইমে রেন্ডারেবল পরিবর্তন করুন

যদি একাধিক নোড রেন্ডারযোগ্য ব্যবহার করে, তাহলে সেই রেন্ডারেবলের পরিবর্তনগুলি সমস্ত নোডে প্রযোজ্য। এই আচরণ এড়াতে, একটি পৃথক রেন্ডারযোগ্য উদাহরণ তৈরি করতে makeCopy() কল করুন। মনে রাখবেন এটিকে রেন্ডারেবলের প্রতিটি উপাদানে makeCopy() বলা হয়।

blueSphereRenderable = redSphereRenderable.makeCopy();
blueSphereRenderable.getMaterial().setFloat3(
                  MaterialFactory.MATERIAL_COLOR, new Color(android.graphics.Color.BLUE));