Renderable
3D modeldir ve tepe noktaları, malzemeler, dokular ve daha fazlasını içerir. Bir Node
ya 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:
res > 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" />
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çinsetView(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));