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:
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" />
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 chiamaresetView(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));