یک Renderable ایجاد کنید

Renderable یک مدل سه بعدی است و از رئوس، متریال، بافت و غیره تشکیل شده است. می توان آن را به یک Node متصل کرد و به عنوان بخشی از یک صحنه رندر کرد. در این صفحه نحوه ایجاد و تغییر Renderable s توضیح داده شده است.

از ویجت های اندروید ایجاد کنید

می توانید یک ViewRenderable از ویجت های استاندارد اندروید ایجاد کنید. اینها به صورت کارت های مسطح در صحنه ارائه می شوند.

برای ایجاد یکی:

  1. یک فایل layout در 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 را برمی‌گردانند. شی بر روی یک رشته مجزا ساخته شده است و تابع callback بر روی رشته اصلی اجرا می شود.

اندازه رندر بر اساس اندازه شی 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"));

ایجاد از یک دارایی سه بعدی

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));