Créer un rendu

Un Renderable est un modèle 3D qui se compose de sommets, de matériaux, de textures et d'autres éléments. Il peut être associé à un Node et rendu dans le cadre d'une scène. Cette page explique comment créer et modifier des Renderable.

Créer à partir de widgets Android

Vous pouvez créer un ViewRenderable à partir de widgets Android standards. Ces éléments sont affichés sous forme de fiches plates dans la scène.

Pour en créer un, procédez comme suit:

  1. Créez un fichier de mise en page avec le paramètre res > layout. Exemple :

    <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. Créez le ViewRenderable.

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

    Cette version de setView() accepte l'ID de ressource du fichier de mise en page non gonflé. Vous pouvez également appeler setView(View) pour créer un affichage à partir de vues créées de manière automatisée.

Toutes les méthodes build() dans Sceneform renvoient un CompletableFuture. L'objet est créé sur un thread distinct et la fonction de rappel est exécutée sur le thread principal.

La taille du rendu est basée sur la taille de l'objet View. Par défaut, chaque 250 dp de la vue passe à 1 mètre pour le rendu. Utilisez setSizer(ViewSizer) pour modifier le mode de calcul de la taille de la vue.

Les modifications apportées à la vue sous-jacente ont une incidence sur l'affichage du rendu. Les nœuds associés à une vue peuvent envoyer des événements tactiles à la vue. Vous pouvez ainsi, par exemple, répondre à une pression sur un bouton.

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

Créer à partir d'un élément 3D

Sceneform fournit des outils et des plug-ins permettant de convertir des fichiers d'éléments 3D (OBJ, WebRTC, glTF) en éléments binaires Sceneform (SFB), qui peuvent ensuite être intégrés dans un objet ModelRenderable.

Pour en savoir plus, consultez Importer et prévisualiser des éléments 3D.

Créer des formes simples au moment de l'exécution

Vous pouvez créer des formes simples telles que des cubes, des sphères et des cylindres à l'aide de ShapeFactory, puis MaterialFactory vous permet de créer des objets exécutables à partir de formes et de matériaux simples.

Voici comment créer une sphère rouge:

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

Charger des modèles 3D au moment de l'exécution

Les modèles 3D stockés sous forme de fichiers glTF ou glb peuvent être chargés au moment de l'exécution sans conversion. Cette approche améliore considérablement la flexibilité des modèles rendus dans votre application. Cependant, le compromis est que le modèle est lu au moment de l'exécution et ne bénéficie pas de l'optimisation effectuée lors de la conversion au moment de la compilation pour sfb. C'est pourquoi nous vous recommandons de tester votre application et vos modèles 3D sur une grande variété d'appareils et de réseaux afin de vous assurer que vos utilisateurs bénéficient d'une expérience optimale.

Pour utiliser le chargement des éléments d'exécution, vous devez ajouter la dépendance à la bibliothèque d'assets dans app/build.gradle :

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

La classe RenderableSource gère le chargement du fichier glTF et la création d'un objet source pour ModelRenderable.Builder qui crée l'objet de rendu.

Par exemple, le chargement d'un modèle depuis Internet se présente comme suit:

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

Remarque: Pour accéder aux ressources à distance, vous devez inclure l'autorisation Internet dans votre fichier AndroidManifest.xml:

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

    </manifest>

Modifier les rendus lors de l'exécution

Si plusieurs nœuds utilisent le rendu, les modifications apportées à ce rendu s'appliquent à tous les nœuds. Pour éviter cela, appelez makeCopy() pour créer une instance de rendu distinct. Notez que cet appel appelle également makeCopy() sur chaque matériau dans le rendu.

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