Bir sahne oluşturma ve sahneyle etkileşim kurma

Bu sayfada, Scene oluşturmayla ve etkileşimde bulunmayla ilgili yaygın ipuçları verilmiştir.

Artırılmış gerçeklik (AR) olmadan sahne oluşturma

SceneView sınıfı, cihazın kamerasının veya AR oturumunun kullanılmasını gerektirmeden 3D sahne oluşturmanıza olanak tanır. Bu, uygulamanızda artırılmış gerçeklik içermeyen 3D nesnelerin önizlemesini yapmak veya artırılmış gerçeklik (AR) desteği olmayan cihazlarda alternatif işlevler sağlamak açısından yararlıdır.

Varsayılan olarak, SceneView, AR kamerasından resim göstermez ve siyah bir arka plan kullanır. Arka plan rengini değiştirmek için view.setBackgroundColor() çağrısı yapabilir veya aşağıda gösterildiği şekilde düzende bir arka plan rengi tanımlayabilirsiniz:

<com.google.ar.sceneform.SceneView
    android:id="@+id/scene_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/deep_teal"/>

Sahnenin Camera düğümü kaynağa (0,0,0 konumu) yerleştirilir ve öne (0,0,-1 yönü) yerleştirilir. Kameranın konumu ve dönüşü AR hareket izlemesine bağlı olmadığından, diğer herhangi bir düğüm gibi bunu yeniden konumlandırabilir veya canlandırabilirsiniz.

Camera camera = sceneView.getScene().getCamera();
camera.setLocalRotation(Quaternion.axisAngle(Vector3.right(), -30.0f));

Etkileşimler

Kullanıcı dokunmasını işleyin

Kullanıcı ekrana dokunduğunda, Sceneform dokunma etkinliğini düğümlere ve sahneye bağlı etkinlik işleyicilere ve dinleyicilere yayar. Bu davranış, dokunma etkinliklerinin Android'deki görüntüleme ve görüntüleme gruplarına yayılmasına benzer. Yayılma sırası:

  1. Etkinlik, scene.addOnPeekTouchListener()'te eklenen tüm dinleyicilere gönderilir.

    Bu, viewGroup.intercept()'e benzer. Tek fark, dokunmatik dokunma işleyicideki sahnenin etkinliği tüketememesidir.

  2. Etkinlik, ışının kesiştiği ilk düğüme aktarılır.

    • Düğüm, true değerini döndüren bir onTouchEvent() yöntem grubu tanımlayarak etkinliği kullanabilir.
    • onTouchEvent() yöntemi false döndürürse veya dinleyici tanımlanmamışsa etkinlik, düğümün üst öğesine yayılır. Bu işlem, etkinlik tüketilene veya sahneye ulaşılana kadar devam eder.
  3. Son olarak, hiçbir dinleyici etkinliği kullanmadıysa etkinlik scene.onTouchListener()'e iletilir.

Hareketleri algıla

ArFragment, dokunma (seçme), sürükleme (taşıma), sıkıştırma (ölçeklendirme) ve bükme (döndürme) hareketlerini destekleyen yerleşik bir yapıya sahiptir.

Örneğin, HelloSceneform örnek uygulamasında HelloSceneformActivity.java öğesine bakın.

Özel düğüm oluşturma

Özel Android görünümleri oluşturmaya benzer şekilde, Node alt sınıfına ayırarak özel düğümler oluşturabilirsiniz. Özel düğüm oluşturmak isteyebileceğiniz bazı durumlar şunlardır:

  • Düğüm yaşam döngüsündeki onUpdate(), onActivate ve onDeactivate() gibi etkinliklere erişmek istiyorsunuz.
  • Bir düğüm grubundan oluşan bir düğüm oluşturmak istiyorsunuz.
  • Çok sayıda kod çoğaltıyorsunuz ve bunu bir alt sınıfa dahil edebilirsiniz.

Örnek için Güneş Sistemi örnek uygulamasında Planet.java bölümünü inceleyin.

Düğümlere animasyon uygulama

Düğümleri canlandırmanın iki yolu vardır:

ObjectAnimator ile animasyon uygulama

Gündem yoğunluğunu gösteren bir örneği burada bulabilirsiniz:

final int durationInMilliseconds = 1000;
final float minimumIntensity = 1000.0f;
final float maximumIntensity = 3000.0f;
ValueAnimator intensityAnimator =
    ObjectAnimator.ofFloat(
        spotlightNode.getLight(), "intensity", minimumIntensity, maximumIntensity);
intensityAnimator.setDuration(durationInMilliseconds);
intensityAnimator.setRepeatCount(ValueAnimator.INFINITE);
intensityAnimator.setRepeatMode(ValueAnimator.REVERSE);
intensityAnimator.start();

Daha fazla bilgi için ObjectAnimator ile animasyon oluşturma bölümüne bakın.

OnUpdate'te animasyon

Düğümün kareden animasyona onUpdate() animasyonunu geçersiz kılın. Aşağıdaki örnekte, Güneş Sistemi örnek uygulamasında Planet.java kaynağından alınan, gezegeni döndürse bile her karede kullanıcının görebileceği şekilde bilgi kartını ayarlar.

@Override
public void onUpdate(FrameTime frameTime) {
  Vector3 cameraPosition = getScene().getCamera().getWorldPosition();
  Vector3 cardPosition = infoCard.getWorldPosition();
  Vector3 direction = Vector3.subtract(cameraPosition, cardPosition);
  Quaternion lookRotation = Quaternion.lookRotation(direction, Vector3.up());
  infoCard.setWorldRotation(lookRotation);
}

Işık ekle

Lights, sahnedeki herhangi bir düğüme eklenebilir. Varsayılan olarak her Sahne görüntüsü, yön ışığı eklenmiş bir Sun düğümü içerir.

Güneş ışığını değiştirebilir veya bir sahneye kendi ışıklarınızı ekleyebilirsiniz. Aşağıdaki örnekte öne çıkanlar eklenmiş:

Light spotLightYellow =
    Light.builder(this, Light.Type.FOCUSED_SPOTLIGHT)
        .setColor(new Color(android.graphics.Color.YELLOW))
        .setShadowCastingEnabled(true)
        .build();

Daha sonra bunu düğüme eklemek için setLight() işlevini çağırın.

Uçak görselleştirmesini özelleştir

Varsayılan olarak sahnede, ARCore tarafından algılandığında Planes öğesini vurgulayan bir PlaneRenderer bulunur. Aşağıdaki gibi görünür:

Algılanan uçakları oluşturmak için kullanılan varsayılan malzemeyi ve dokuyu değiştirebilirsiniz. Dokuyu nasıl değiştireceğiniz aşağıda açıklanmıştır:

Texture.Sampler sampler =
        Texture.Sampler.builder()
                .setMinFilter(Texture.Sampler.MinFilter.LINEAR)
                .setWrapMode(Texture.Sampler.WrapMode.REPEAT)
                .build();

// R.drawable.custom_texture is a .png file in src/main/res/drawable
Texture.builder()
        .setSource(this, R.drawable.custom_texture)
        .setSampler(sampler)
        .build()
        .thenAccept(texture -> {
          arSceneView.getPlaneRenderer()
                  .getMaterial().thenAccept(material ->
                  material.setTexture(PlaneRenderer.MATERIAL_TEXTURE, texture));
        });

Koyu alanlar

Gölgeler, izleyicilerin dünyayı temel alan bir şekilde görünmesini sağlar ve kullanıcılara derinlik ve alan hissi verir.

Sahne biçiminde gölge oluşturabilen ve gölge alabilen nesneler bulunur.

  • Lights ve Renderables gölge yayınlayabilir

    Gölge yayın varsayılan olarak güneşte etkindir ancak ışıklar için etkinleştirilmez. Etkinleştirmek için setShadowCastingEnabled() numaralı telefonu arayın.

  • Renderables ve PlaneRenderer gölge alabilir.

    Gölge alma varsayılan olarak etkindir. Devre dışı bırakmak için setShadowReceiver() numarasını arayın.

Oluşturulabilir ve hem gölge hem de gölge alırsa gölgeleri kendi başına yayınlayabilir.