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ı:
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.Etkinlik, ışının kesiştiği ilk düğüme aktarılır.
- Düğüm,
truedeğerini döndüren bironTouchEvent()yöntem grubu tanımlayarak etkinliği kullanabilir. onTouchEvent()yöntemifalsedö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.
- Düğüm,
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(),onActivateveonDeactivate()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:
- Standart Android Animation API'sinden
ObjectAnimator'u kullanın. - Özel düğüm sınıfı oluşturma ve
onUpdate()değerini geçersiz kılma
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.
LightsveRenderablesgölge yayınlayabilirGö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.RenderablesvePlaneRenderergö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.


