Crea un rendering

Un Renderable è un modello 3D costituito da vertici, materiali, texture e altro ancora. Può essere collegato a una Node e visualizzata come parte di una scena. In questa pagina viene descritto come creare e modificare i Renderable.

Crea da widget Android

Puoi creare una ViewRenderable da widget Android standard. Questi vengono visualizzati come schede piatte nella scena.

Per crearne uno:

  1. Crea un file di layout in res > layout. Ad esempio:

    <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. Crea il ViewRenderable.

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

    Questa versione di setView() prende l'ID risorsa del file di layout non Gonfiato. Puoi anche chiamare setView(View) per creare un rendering da visualizzazioni create in modo programmatico.

Tutti i metodi build() in Sceneform restituiscono un CompletableFuture. L'oggetto è basato su un thread separato e la funzione di callback viene eseguita sul thread principale.

Le dimensioni del rendering si basano sulle dimensioni dell'oggetto View. Per impostazione predefinita, ogni 250 dp per la vista diventa 1 metro per il rendering. Utilizza setSizer(ViewSizer) per modificare la modalità di calcolo della dimensione della vista.

Le modifiche alla visualizzazione sottostante influiscono sulla modalità di visualizzazione del rendering. I nodi con una vista visibile allegata inviano eventi touch alla vista, in modo che tu possa, ad esempio, rispondere a una pressione di un pulsante.

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

Crea da un asset 3D

Sceneform fornisce strumenti e plug-in per la conversione di file di asset 3D (OBJ, OBA, glTF) in asset binari di Sceneform (SFB), che possono quindi essere integrati in un ModelRenderable.

Per saperne di più, consulta Importare e visualizzare in anteprima gli asset 3D.

Crea forme semplici al momento dell'esecuzione

Semplici forme come cubi, sfere e cilindri possono essere create utilizzando ShapeFactory e MaterialFactory consentono di creare oggetti rendering da forme e materiali semplici.

Ecco come creare una sfera rossa:

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

Carica modelli 3D in esecuzione

I modelli 3D archiviati come file glTF o glb possono essere caricati in fase di runtime senza conversione. Questo migliora notevolmente la flessibilità dei modelli visualizzati nell'applicazione, ma è anche possibile leggerlo in fase di runtime e non trarre vantaggio dall'ottimizzazione che viene eseguita durante la conversione in fase di build in sfb. Per questo motivo, ti consigliamo di testare l'applicazione e i modelli 3D su un'ampia gamma di dispositivi e condizioni di rete per garantire agli utenti un'esperienza ottimale.

Per utilizzare il caricamento degli asset in fase di runtime, devi aggiungere la dipendenza nella raccolta di asset in app/build.gradle:

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

La classe RenderableSource gestisce il caricamento del file glTF e crea un oggetto di origine per ModelRenderable.Builder che crea l'oggetto visualizzabile.

Ad esempio, il caricamento di un modello da Internet ha il seguente aspetto:

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

Nota: per accedere alle risorse da remoto, devi includere l'autorizzazione Internet nel tuo file AndroidManifest.xml:

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

    </manifest>

Modifica rendering di elementi runtime

Se più nodi usano il rendering, le modifiche al rendering saranno applicate a tutti i nodi. Per evitare tale comportamento, chiama makeCopy() per creare un'istanza di rendering separata. Nota che questo chiama anche makeCopy() su ogni materiale nel rendering.

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