إنشاء ملف قابل للعرض

تمثّل Renderable نموذجًا ثلاثي الأبعاد، ويتألف من الرؤوس والمواد والزخارف وغيرها. ويمكن إرفاقه Node وعرضه كجزء من مشهد. توضّح هذه الصفحة كيفية إنشاء Renderable وتعديلها.

الإنشاء من أدوات Android

يمكنك إنشاء ViewRenderable من أدوات Android العادية. يتم عرض هذه البطاقات على شكل بطاقات مسطّحة في المشهد.

لإنشاء حساب:

  1. أنشئ ملف تنسيق في res >Layout. مثلاً:

    <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() رقم تعريف المورد لملف التنسيق غير المتضخم. ويمكنك أيضًا طلب setView(View) لإنشاء عرض قابل للعرض من الملفات الشخصية التي يتم إنشاؤها آليًا.

تعرض جميع طرق build() في Sceneform CompletableFuture. يتم إنشاء العنصر على سلسلة محادثات منفصلة ويتم تنفيذ دالة رد الاتصال على سلسلة المحادثات الرئيسية.

يعتمد حجم العرض القابل للعرض على حجم العنصر View. حسب الإعدادات التلقائية، يصبح كل 250 وحدة بكسل مستقلة الكثافة للعرض واحد متر واحد للعرض. يمكنك استخدام setSizer(ViewSizer) لتغيير كيفية حساب حجم الملف الشخصي.

التغييرات التي يتم إجراؤها على طريقة العرض الأساسية تؤثر في طريقة عرض المحتوى القابل للعرض. تعمل العُقد التي تحتوي على ملف شخصي قابل للعرض على إرسال أحداث اللمس إلى العرض، حتى تتمكن من الرد على ضغط الزر مثلاً.

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

الإنشاء من مادة عرض ثلاثية الأبعاد

يوفر تطبيق Sceneform أدوات ومكوّنات إضافية لتحويل ملفات مواد العرض الثلاثية الأبعاد (OBJ وFBX وglTF) إلى مواد العرض الثنائية بتنسيق Sceneform (SFB)، والتي يمكن دمجها في شكل ملف ModelRenderable.

لمزيد من المعلومات، راجِع استيراد مواد العرض الثلاثية الأبعاد ومعاينتها.

إنشاء أشكال بسيطة في وقت التشغيل

يمكن إنشاء أشكال بسيطة، مثل المكعبات والصور البانورامية والأسطوانات باستخدام 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); });

تحميل نماذج ثلاثية الأبعاد في وقت التشغيل

ويمكن تحميل النماذج الثلاثية الأبعاد المُخزَّنة كملفات glTF أو glb في وقت التشغيل بدون إحالة ناجحة. يؤدي ذلك إلى تحسين مرونة النماذج المعروضة في تطبيقك إلى حد كبير، لكن المقايضة هي أن تتم قراءة النموذج في وقت التشغيل ولا يستفيد من التحسين الذي يتم أثناء إحالة ناجحة وقت الإنشاء إلى sfb. لهذا السبب، ننصح باختبار التطبيق والنماذج الثلاثية الأبعاد على مجموعة واسعة من الأجهزة وأحوال الشبكة للتأكُّد من حصول المستخدمين على تجربة رائعة.

لاستخدام تحميل مواد عرض وقت التشغيل، يجب إضافة الاعتمادية على مكتبة مواد العرض في app/build.gradle:

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

تعالج فئة RenderableSource تحميل ملف glTF وإنشاء عنصر مصدر لـ 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));