Oluşturulabilir Oluştur

Renderable 3D modeldir ve tepe noktaları, malzemeler, dokular ve daha fazlasını içerir. Bir Nodeya eklenebilir ve bir sahnenin parçası olarak oluşturulabilir. Bu sayfada, Renderable öğelerinin nasıl oluşturulacağı ve değiştirileceği açıklanmaktadır.

Android widget'larından oluşturma

Standart Android widget'larından bir ViewRenderable oluşturabilirsiniz. Bunlar sahnede düz kartlar olarak oluşturulur.

Kayıt oluşturmak için:

  1. res &gt düzeni içinde bir düzen dosyası oluşturun. Örneğin:

    <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. ViewRenderable oluşturun.

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

    Bu setView() sürümü, şişirilmemiş düzen dosyasının kaynak kimliğini alır. Programlı olarak oluşturulan görünümlerden oluşturulabilir bir oluşturma oluşturmak için setView(View) çağrısı da yapabilirsiniz.

Sceneform'daki tüm build() yöntemleri CompletableFuture döndürür. Nesne ayrı bir iş parçacığında oluşturulur ve geri çağırma işlevi ana iş parçacığında yürütülür.

Oluşturulabilir boyutu, View nesnesinin boyutuna bağlıdır. Varsayılan olarak, görünüm için 250 dp'lik bir resim işlenebilir olarak oluşturulur. Görünüm boyutunun hesaplanma şeklini değiştirmek için setSizer(ViewSizer) aracını kullanın.

Temel görünümde yapılan değişiklikler, oluşturulup oluşturulabilme şeklini etkiler. Oluşturulabilir bir görüntüye sahip olan düğümler, dokunma etkinliklerini görünüme gönderir. Böylece, örneğin bir düğmeye basarak yanıt verebilirsiniz.

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

3B öğeden oluşturun

Sceneform, 3D öğe dosyalarını (OBJ, {8/}, glTF) Sceneform ikili öğelerine (SFB) dönüştürmek için kullanılan araçlar ve eklentiler sağlar. Daha sonra bu araçlar, ModelRenderable içine eklenebilir.

Daha fazla bilgi için 3D Öğeleri İçe Aktarma ve Önizleme konusuna bakın.

Çalışma zamanında basit şekiller oluşturun

Küp, küre ve silindir gibi basit şekiller ShapeFactory kullanarak oluşturulabilir ve MaterialFactory basit şekiller ve materyallerden oluşturulabilen nesneler oluşturmanıza olanak tanır.

Kırmızı küre nasıl oluşturulur?

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

Çalışma zamanında 3D modelleri yükle

glTF veya glb dosyası olarak depolanan 3D modeller, dönüşüm olmadan çalışma zamanında yüklenebilir. Bu, uygulamanızda oluşturulan modellerin esnekliğini büyük ölçüde iyileştirir ancak bu değer, modelin çalışma zamanında okunduğu ve derleme zamanının sfb ürününe dönüştürülmesi sırasında yapılan optimizasyondan fayda sağlamadığı anlamına gelir. Bu nedenle, iyi bir kullanıcı deneyimi sunmak için uygulamanızı ve 3D modellerinizi çok çeşitli cihaz ve ağ koşullarında test etmeniz önerilir.

Çalışma zamanı öğesi yüklemeyi kullanmak için app/build.gradle varlığında öğe kitaplığına bağımlılığı eklemeniz gerekir:

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

RenderableSource sınıfı, glTF dosyasını yüklemeyi ve ModelRenderable.Builder öğesi için oluşturulabilir nesneyi oluşturan bir kaynak nesnesinin oluşturulmasını yönetir.

Örneğin, internet üzerinden yüklenen bir model aşağıdaki gibi görünür:

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

Not: Kaynaklara uzaktan erişmek için AndroidManifest.xml dosyanıza internet iznini eklemeniz gerekir:

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

    </manifest>

Oluşturulabilir görüntüleri çalışma zamanında değiştir

Oluşturulabilir birden fazla düğüm kullanılırsa bu oluşturmada yapılan değişiklikler tüm düğümlere uygulanır. Bu davranışı önlemek için makeCopy() çağrısı yaparak ayrı bir oluşturulabilir örnek oluşturun. Bu aynı zamanda, oluşturulabilir içindeki her materyalde makeCopy() öğesini çağırır.

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