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,
true
değerini döndüren bironTouchEvent()
yöntem grubu tanımlayarak etkinliği kullanabilir. onTouchEvent()
yöntemifalse
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.
- 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()
,onActivate
veonDeactivate()
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.
Lights
veRenderables
gö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.Renderables
vePlaneRenderer
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.