Renderable erstellen

Ein Renderable ist ein 3D-Modell und besteht aus Eckpunkten, Materialien, Texturen und mehr. Sie kann an eine Node angehängt und als Teil einer Szene gerendert werden. Auf dieser Seite wird beschrieben, wie Renderables erstellt und geändert werden.

Aus Android-Widgets erstellen

Du kannst ein ViewRenderable aus Standard-Android-Widgets erstellen. Diese werden als flache Karten im Ambiente dargestellt.

So erstellen Sie eines:

  1. Erstellen Sie eine Layoutdatei im Format res > Layout. Beispiel:

    <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. Erstellen Sie den ViewRenderable.

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

    Diese Version von setView() verwendet die Ressourcen-ID der nicht aufgeblähten Layoutdatei. Sie können auch setView(View) aufrufen, um ein Rendering aus programmatisch erstellten Ansichten zu erstellen.

Alle build()-Methoden in Sceneform geben CompletableFuture zurück. Das Objekt wird in einem separaten Thread erstellt und die Callback-Funktion wird im Hauptthread ausgeführt.

Die Größe des Renderables richtet sich nach der Größe des View-Objekts. Standardmäßig werden alle 250 dp für die Ansicht zu 1 m zum gerenderten Objekt. Verwenden Sie setSizer(ViewSizer), um die Größe der Ansicht zu ändern.

Änderungen an der zugrunde liegenden Ansicht wirken sich darauf aus, wie die gerenderte Anzeige dargestellt wird. Knoten, an die eine Ansicht gerendert werden kann, senden Touch-Ereignisse an die Ansicht, sodass Sie z. B. auf eine Tastenbetätigung reagieren können.

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

Aus einem 3D-Asset erstellen

Sceneform bietet Tools und Plug-ins für die Konvertierung von 3D-Asset-Dateien (OBJ, Gboard, glTF) in Sceneform-Binärdateien (SFB). Diese können dann in ein ModelRenderable integriert werden.

Weitere Informationen finden Sie unter 3D-Assets importieren und als Vorschau ansehen.

Einfache Formen zur Laufzeit erstellen

Einfache Formen wie Würfel, Kugeln und Zylinder können mit ShapeFactory und MaterialFactory erstellt werden, um Renderobjekte aus einfachen Formen und Materialien zu erstellen.

So erstellen Sie eine rote Kugel:

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-Modelle zur Laufzeit laden

3D-Modelle, die als glTF- oder glb-Dateien gespeichert sind, können zur Laufzeit ohne Konvertierung geladen werden. Dadurch wird die Flexibilität der in Ihrer Anwendung gerenderten Modelle erheblich verbessert. Der Kompromiss besteht jedoch darin, dass das Modell zur Laufzeit gelesen wird und nicht von der Optimierung profitiert, die während der Konvertierung der Build-Zeit in sfb erfolgt. Aus diesem Grund wird empfohlen, dass Sie Ihre Anwendung und 3D-Modelle auf einer Vielzahl von Geräten und Netzwerkbedingungen testen, um Ihren Nutzern eine optimale Erfahrung zu bieten.

Wenn Sie das Laufzeit-Asset laden möchten, müssen Sie die Abhängigkeit von der Asset-Bibliothek in app/build.gradle hinzufügen:

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

Die Klasse RenderableSource übernimmt das Laden der glTF-Datei und das Erstellen eines Quellobjekts für ModelRenderable.Builder, mit dem das gerenderte Objekt erstellt wird.

So wird beispielsweise ein Modell aus dem Internet geladen:

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

Hinweis: Für den Remotezugriff auf Ressourcen müssen Sie die Berechtigung „Internet“ in die Datei „AndroidManifest.xml“ aufnehmen:

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

    </manifest>

Renderingfähige Renderings zur Laufzeit ändern

Wenn mehrere Knoten den Renderer verwenden, gelten Änderungen an diesem Renderer für alle Knoten. Wenn Sie das vermeiden möchten, können Sie makeCopy() aufrufen, um eine separate Render-Instanz zu erstellen. Beachten Sie, dass damit auch makeCopy() für jedes Material im Renderer aufgerufen wird.

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