de Ayusch Jain

Cum să construiești o aplicație Android cu realitate augmentată cu ARCore și Android Studio

Cum sa construiesti o aplicatie Android cu realitate augmentata cu

Acest articol a fost postat inițial Aici

În postarea anterioară, Am explicat ce este ARCore și modul în care îi ajută pe dezvoltatori să construiască aplicații minunate de realitate augmentată fără a fi nevoie să înțeleagă OpenGL sau Matrice matematica.

Dacă nu l-ați verificat încă, vă recomand să faceți acest lucru înainte de a continua acest articol și de a vă scufunda în dezvoltarea aplicațiilor ARCore.

Prezentare generală

Potrivit Wikipedia, ARCore este un kit de dezvoltare software dezvoltat de Google care permite construirea de aplicații de realitate augmentată.

ARCore folosește trei tehnologii cheie pentru a integra conținutul virtual cu mediul real:

  1. Urmărirea mișcării: permite telefonului să-și înțeleagă poziția față de lume.
  2. Înțelegerea mediului: Acest lucru permite telefonului să detecteze dimensiunea și locația tuturor tipurilor de suprafețe, verticale, orizontale și unghiulare.
  3. Estimarea luminii: permite telefonului să estimeze condițiile actuale de iluminare ale mediului.

Noțiuni de bază

Pentru a începe cu Aplicația ARCore dezvoltare, trebuie mai întâi să activați ARCore în proiectul dvs. Acest lucru este simplu, deoarece vom folosi Android Studio și Sceneform SDK. Există două operații majore pe care Sceneform le efectuează automat:

  1. Verificarea disponibilității ARCore
  2. Solicit permisiunea camerei

Nu trebuie să vă deranjați cu acești doi pași atunci când creați o aplicație ARCore utilizând Sceneform SDK. Dar trebuie să includeți Sceneform SDK în proiect.

Creați un nou proiect Android Studio și selectați o activitate goală.

Adăugați următoarea dependență la fișierul build.gradle la nivel de proiect:

dependencies {    classpath 'com.google.ar.sceneform:plugin:1.5.0'}

Adăugați următoarele la fișierul build.gradle la nivel de aplicație:

implementation "com.google.ar.sceneform.ux:sceneform-ux:1.5.0"

Acum sincronizați proiectul cu fișierele Gradle și așteptați finalizarea construcției. Aceasta va instala Sceneform SDK în proiect și Sceneform plugin în AndroidStudio. Vă va ajuta să vizualizați fișierul.sfb fișiere. Aceste fișiere sunt modelele 3D care sunt redate în camera dvs. De asemenea, vă ajută la import, vizionare și construire Active 3D.

Construirea primei aplicații ARCore

Acum cu a noastră Android Studio configurarea completă și Sceneform SDK instalat, putem începe cu scrierea primelor noastre Aplicația ARCore.

Mai întâi, trebuie să adăugăm fragmentul Sceneform în fișierul nostru de aspect. Aceasta va fi scena în care plasăm toate modelele noastre 3D. Se ocupă de inițializarea camerei și de gestionarea permisiunilor.

Mergeți la fișierul principal de aspect. În cazul meu este activity_main.xml și adăugați fragmentul Sceneform:

<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity">
    <fragment android:name="com.google.ar.sceneform.ux.ArFragment"        android:id="@+id/ux_fragment"        android:layout_width="match_parent"        android:layout_height="match_parent" />
</FrameLayout>

Am setat lățimea și înălțimea pentru a se potrivi cu părintele, deoarece aceasta va acoperi întreaga mea activitate. Puteți alege dimensiunile în funcție de cerințele dvs.

Verificarea compatibilității

Acesta este tot ceea ce trebuie să faceți în fișierul de aspect. Acum mergeți la fișierul java, în cazul meu, care este MainActivity.java. Adăugați metoda de mai jos în clasa dvs.:

public static boolean checkIsSupportedDeviceOrFinish(final Activity activity) {    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {        Log.e(TAG, "Sceneform requires Android N or later");        Toast.makeText(activity, "Sceneform requires Android N or later", Toast.LENGTH_LONG).show();        activity.finish();        return false;    }    String openGlVersionString =            ((ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE))                    .getDeviceConfigurationInfo()                    .getGlEsVersion();    if (Double.parseDouble(openGlVersionString) < MIN_OPENGL_VERSION) {        Log.e(TAG, "Sceneform requires OpenGL ES 3.0 later");        Toast.makeText(activity, "Sceneform requires OpenGL ES 3.0 or later", Toast.LENGTH_LONG)                .show();        activity.finish();        return false;    }    return true;}

Această metodă verifică dacă dispozitivul dvs. poate accepta sau nu Sceneform SDK. SDK necesită Android API nivelul 27 sau mai nou și OpenGL ES versiunea 3.0 sau mai nou. Dacă un dispozitiv nu acceptă aceste două, Scena nu va fi redată și aplicația dvs. va afișa un ecran gol.

Deși, puteți continua să livrați toate celelalte caracteristici ale aplicației dvs. care nu necesită Sceneform SDK.

Acum, după verificarea compatibilității dispozitivului, vom construi modelul nostru 3D și îl vom atașa la scenă.

Adăugarea activelor

Va trebui să adăugați modelele 3D care vor fi redate pe ecran. Acum puteți construi singuri aceste modele dacă sunteți familiarizat cu crearea modelelor 3D. Sau, puteți vizita Poli.

Acolo veți găsi un depozit imens de materiale 3D din care să alegeți. Se pot descărca gratuit. Doar meritați-l pe creator și sunteți bine să plecați.

Cum sa construiesti o aplicatie Android cu realitate augmentata cu

În Android Studio, extindeți folderul aplicației disponibil în panoul de proiect din partea stângă. Veți observa o sampledata pliant. Acest dosar va conține toate activele modelului dvs. 3D. Creați un folder pentru modelul dvs. în dosarul de date eșantion.

Când descărcați fișierul zip din poly, cel mai probabil veți găsi 3 fișiere.

  1. fișier .mtl
  2. fișier .obj
  3. fișier .png

Cel mai important dintre acestea 3 este fișierul .obj. Este modelul tău real. Plasați toate cele 3 fișiere în interior sampledata -> „modelul tău este pliabilr ”.

1612175649 995 Cum sa construiesti o aplicatie Android cu realitate augmentata cu

Acum faceți clic dreapta pe .obj fişier. Prima opțiune ar fi importarea activelor Sceneform. Faceți clic pe el, nu modificați setările implicite, trebuie doar să faceți clic pe Terminare în fereastra următoare. Gradul dvs. se va sincroniza pentru a include activul în dosarul activelor. Odată ce construirea gradle se termină, sunteți bine să mergeți.

Ați terminat de importat un material 3D utilizat de Sceneform în proiectul dvs. Următorul, să construim activul din codul nostru și să îl includem în scenă.

Construirea modelului

Adăugați următorul cod în fișierul dvs. MainActivity.java (sau orice altceva este în cazul dvs.). Nu vă faceți griji, vă explic toate codurile rând cu rând:

private static final String TAG = MainActivity.class.getSimpleName();private static final double MIN_OPENGL_VERSION = 3.0;
ArFragment arFragment;ModelRenderable lampPostRenderable;
@Override@SuppressWarnings({"AndroidApiChecker", "FutureReturnValueIgnored"})
protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    if (!checkIsSupportedDeviceOrFinish(this)) {        return;    }    setContentView(R.layout.activity_main);    arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment);
    ModelRenderable.builder()            .setSource(this, Uri.parse("LampPost.sfb"))            .build()            .thenAccept(renderable -> lampPostRenderable = renderable)            .exceptionally(throwable -> {                Toast toast =                        Toast.makeText(this, "Unable to load andy renderable", Toast.LENGTH_LONG);                toast.setGravity(Gravity.CENTER, 0, 0);                toast.show();                return null;            });
}

Primul, găsim arFragment pe care l-am inclus în fișierul de aspect. Acest fragment este responsabil pentru găzduirea scenei. Vă puteți gândi la acesta ca la containerul scenei noastre.

Următorul, folosim ModelRenderable clasa pentru a ne construi modelul. Cu ajutorul metodei setSource, ne încărcăm modelul din.sfb fişier. Acest fișier a fost generat când am importat activele. apoi Acceptă metoda primește modelul odată ce este construit. Am setat modelul încărcat la lampPostRenderable.

Pentru tratarea erorilor, avem .excepţional metodă. Se numește în cazul în care se aruncă o excepție.

Toate acestea se întâmplă asincron, prin urmare, nu trebuie să vă faceți griji cu privire la multi-threading sau să vă ocupați de handlerele XD

Cu modelul încărcat și stocat în lampPostRenderable variabilă, acum o vom adăuga la scena noastră.

Adăugarea modelului la scenă

arFragment găzduiește scena noastră și va primi evenimentele de atingere. Deci, trebuie să setăm ascultătorul onTap la fragmentul nostru pentru a înregistra robinetul și a plasa un obiect în consecință. Adăugați următorul cod la metoda onCreate:

arFragment.setOnTapArPlaneListener(        (HitResult hitresult, Plane plane, MotionEvent motionevent) -> {            if (lampPostRenderable == null){                return;            }
            Anchor anchor = hitresult.createAnchor();            AnchorNode anchorNode = new AnchorNode(anchor);            anchorNode.setParent(arFragment.getArSceneView().getScene());
            TransformableNode lamp = new TransformableNode(arFragment.getTransformationSystem());            lamp.setParent(anchorNode);            lamp.setRenderable(lampPostRenderable);            lamp.select();        });

Am setat onTapArPlaneListener la noi Fragment AR. Apoi ceea ce vedeți este Sintaxa Java 8, în cazul în care nu sunteți familiarizați cu acesta, vă recomand să verificați acest ghid.

Primul, ne creăm ancora din HitResult folosind hitresult.createAnchor () și stocați-l într-un obiect Anchor.

Următorul, creați un nod din această ancoră. Se va numi AnchorNode. Acesta va fi atașat la scenă apelând metoda setParent pe ea și trecând scena din fragment.

Acum creăm un TransformableNode care va fi a noastră stâlp de felinar și setați-l la punctul de ancorare sau la nodul nostru de ancorare. Nodul încă nu are nicio informație despre obiectul pe care trebuie să îl redea. Vom trece acel obiect folosind lampă.setRenderable metoda care ia un parametru care poate fi redat. Apelați în cele din urmă lamp.select ();

Phew !! Prea multă terminologie acolo, dar nu vă faceți griji, voi explica totul.

  1. Scenă: Acesta este locul în care vor fi redate toate obiectele 3D. Această scenă este găzduită de fragmentul AR pe care l-am inclus în aspect. La acest ecran este atașat un nod de ancorare care acționează ca rădăcina arborelui și toate celelalte obiecte sunt redate ca obiecte ale acestuia.
  2. HitResult: Aceasta este o linie imaginară (sau o rază) care vine de la infinit, care dă punctul de intersecție al său cu un obiect din lumea reală.
  3. Ancoră: O ancoră este o locație și o orientare fixe în lumea reală. Poate fi înțeleasă ca coordonatele x, y, z în spațiul 3D. Puteți obține informații despre postarea unei ancore din aceasta. Pose este poziția și orientarea obiectului în scenă. Aceasta este utilizată pentru a transforma spațiul de coordonate locale al obiectului în spațiu de coordonate din lumea reală.
  4. AnchorNode: Acesta este nodul care se poziționează automat în lume. Acesta este primul nod care este setat atunci când planul este detectat.
  5. TransformableNode: Este un nod cu care se poate interacționa. Poate fi mutat, rotit la scară și multe altele. În acest exemplu, putem scala lampă și rotiți-l. De aici și numele Transformabil.

Aici nu există știință despre rachete. Este foarte simplu. Întreaga scenă poate fi vizualizată ca un grafic cu Scene ca părinte, AnchorNode ca copil și apoi ramificând diferite noduri / obiecte care urmează să fie redate pe ecran.

MainActivity.java finală trebuie să arate cam așa:

package com.ayusch.arcorefirst;
import android.app.Activity;import android.app.ActivityManager;import android.content.Context;import android.net.Uri;import android.os.Build;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.Gravity;import android.view.MotionEvent;import android.widget.Toast;
import com.google.ar.core.Anchor;import com.google.ar.core.HitResult;import com.google.ar.core.Plane;import com.google.ar.sceneform.AnchorNode;import com.google.ar.sceneform.rendering.ModelRenderable;import com.google.ar.sceneform.ux.ArFragment;import com.google.ar.sceneform.ux.TransformableNode;
public class MainActivity extends AppCompatActivity {    private static final String TAG = MainActivity.class.getSimpleName();    private static final double MIN_OPENGL_VERSION = 3.0;
    ArFragment arFragment;    ModelRenderable lampPostRenderable;
    @Override    @SuppressWarnings({"AndroidApiChecker", "FutureReturnValueIgnored"})    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        if (!checkIsSupportedDeviceOrFinish(this)) {            return;        }        setContentView(R.layout.activity_main);        arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment);
        ModelRenderable.builder()                .setSource(this, Uri.parse("LampPost.sfb"))                .build()                .thenAccept(renderable -> lampPostRenderable = renderable)                .exceptionally(throwable -> {                    Toast toast =                            Toast.makeText(this, "Unable to load andy renderable", Toast.LENGTH_LONG);                    toast.setGravity(Gravity.CENTER, 0, 0);                    toast.show();                    return null;                });
            arFragment.setOnTapArPlaneListener(                    (HitResult hitresult, Plane plane, MotionEvent motionevent) -> {                        if (lampPostRenderable == null){                            return;                        }
                        Anchor anchor = hitresult.createAnchor();                        AnchorNode anchorNode = new AnchorNode(anchor);                        anchorNode.setParent(arFragment.getArSceneView().getScene());
                        TransformableNode lamp = new TransformableNode(arFragment.getTransformationSystem());                        lamp.setParent(anchorNode);                        lamp.setRenderable(lampPostRenderable);                        lamp.select();                    }            );
    }
    public static boolean checkIsSupportedDeviceOrFinish(final Activity activity) {        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {            Log.e(TAG, "Sceneform requires Android N or later");            Toast.makeText(activity, "Sceneform requires Android N or later", Toast.LENGTH_LONG).show();            activity.finish();            return false;        }        String openGlVersionString =                ((ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE))                        .getDeviceConfigurationInfo()                        .getGlEsVersion();        if (Double.parseDouble(openGlVersionString) < MIN_OPENGL_VERSION) {            Log.e(TAG, "Sceneform requires OpenGL ES 3.0 later");            Toast.makeText(activity, "Sceneform requires OpenGL ES 3.0 or later", Toast.LENGTH_LONG)                    .show();            activity.finish();            return false;        }        return true;    }}

Felicitări!! Tocmai ați finalizat prima aplicație ARCore. Începeți să adăugați obiecte și vedeți-le prind viață în lumea reală!

Aceasta a fost prima dvs. privire asupra modului de a crea un simplu Aplicația ARCore de la zero cu Android Studio. În următorul tutorial, aș merge mai adânc în ARCore și aș adăuga mai multe funcționalități aplicației.

Dacă aveți sugestii sau orice subiect pe care doriți un tutorial, menționați-l doar în secțiunea de comentarii și vă voi obliga cu plăcere.

Îți place ce ai citit? Nu uitați să distribuiți această postare pe Facebook, Whatsapp și LinkedIn.

Poți să mă urmărești mai departe LinkedIn, Quora, Stare de nervozitate și Instagram unde eu Răspuns întrebări legate de Dezvoltare mobilă, în special Android și Flutter.