3D modeli özelleştirmeden önce uygulamanıza eklemeniz gerekir. Uygulamanıza 3D model ekledikten sonra, 3D modelin görünümünü ve hareketini özelleştirerek görsel ve etkileşimli deneyimi iyileştirebilirsiniz.
Örneğin, yerleştirilmiş glTF animasyonlarını oynatıp kontrol edebilir, modelinizi oluşturan düğümlere erişip bunları taşıyabilir veya hatta özel dokular yükleyip malzeme özelliklerini tanımlayarak dahili örgüleri geçersiz kılabilirsiniz. Bu özellikler, çalışma zamanında bir nesnenin görünümünü ve davranışını dinamik olarak değiştirmenize olanak tanır.
Android XR'daki 3D nesneler
Jetpack XR SDK, 3D modeller ve oluşturmalar için Khronos Group'un glTF 2.0 açık standardını destekler. Bu nesneleri, glTF 2.0 standardında belirtilen fiziksel temelli oluşturma (PBR) teknikleriyle (desteklenen uzantılarla birlikte) oluşturur. glTF (Graphics Library Transmission Format), 3D sahneleri ve modelleri iletmek ve yüklemek için kullanılan standart bir dosya biçimidir. glTF modeli, iç bileşenlerin hiyerarşik yapısından oluşur.
Anlamanız gereken temel bileşenler şunlardır:
- Düğümler: Modelin yapısını ve hiyerarşisini tanımlar. Her düğümün kendi konumu, dönüşü ve ölçeği olabilir.
- Ağlar: 3D nesnenin şeklini oluşturan yapısal 3D geometri.
- Malzemeler: Bunlar, örgülerin görsel görünümünü tanımlar (ör. renkleri, pürüzlülükleri veya ışıklandırmaya nasıl tepki verdikleri).
- Dokular: Özel desenler, renkler, ayrıntılar veya diğer görsel efektler oluşturmak için 3D modelin yüzeyine uygulayabileceğiniz bir resim öğesi (ör. PNG dosyası).
- Animasyonlar: Bunlar, zaman içinde hareket görünümü oluşturmak için tek tek düğümlerde ve ağlarda yapılan değişiklikleri içeren önceden tanımlanmış sıralar veya animasyon izleridir.
XR için Jetpack Compose'da bu dosyaları SpatialGltfModel kullanarak oluşturur ve yükleme ile animasyon durumunu SpatialGltfModelState kullanarak izlersiniz.
Daha fazla bilgi için Uygulamanıza 3D model ekleme başlıklı makaleyi inceleyin.
3D modelleri animasyon haline getirme
3D modellerde yerleştirilmiş animasyonlar olabilir. Animasyonlar, bir hareketin zamanlamasını ve değerlerini tanımlamak için dahili olarak örnekleyicileri, bu hareketleri tek tek düğümlere ve ağlara bağlamak için ise kanalları kullanır. KHR_animation_pointer glTF uzantısıyla oluşturulan iskelet animasyonları ve materyal animasyonları Jetpack XR SDK'da desteklenir.
XR için Compose'u kullanarak bir animasyonu oynatmak üzere animations listesinden belirli bir parçanın adını belirtin. Oynatmaya başlamak için animation.start() simgesini kullanın. İsteğe bağlı olarak, SpatialGltfModelAnimation kullanarak hızı, arama süresini ve animasyonun döngüye girip girmeyeceğini belirtebilirsiniz:
val animation = modelState.animations.find { it.name == "Walk" } animation?.animationState?.let { state -> LaunchedEffect(state) { Log.i("SpatialGltfModelAnimationSample", "Animation State: $state") } } DisposableEffect(animation) { animation?.loop() onDispose { animation?.stop() } }
Düğümleri Değiştirme: Pozlar ve Döndürme
Bir modelin belirli bölümlerini değiştirmek ve döndürme veya poz gibi özelliklerini değiştirmek için nodes kullanarak glTF modelinin dahili SpatialGltfModelState sorgusunu yapmanız gerekir.
// Retrieve the list of nodes (individual components/meshes) defined within the glTF model. val entityNodes = modelState.nodes // Find a specific node by name to apply modifications, such as material overrides. val node = entityNodes.find { it.name == "node_name" }
Doğru düğümü bulduktan sonra, localPose ayarını yaparak 3D konumunu ve dönüşünü doğrudan üst öğesine GltfModelNode göre değiştirebilir veya modelPose ayarını kullanarak konumu GltfModelEntity köküne göre ayarlayabilirsiniz. Benzer şekilde, modelin ölçeğini üst öğesine veya köküne göre değiştirmek için localScale/modelScale'i kullanabilirsiniz.
LaunchedEffect(node, degrees) { val rotation = Quaternion.fromEulerAngles(degrees, 0f, degrees) node?.let { it.localPose = Pose(it.localPose.translation, rotation) } }
3D modelinizin malzeme özelliklerini özelleştirme
Çalışma zamanında materyal özelliklerini ayarlayarak nesnelerin görünümünü kullanıcı girişine veya uygulamanın mevcut durumuna göre dinamik olarak değiştirebilirsiniz.
Jetpack XR'da bu materyalleri oluşturmak ve değiştirmek için KhronosPbrMaterial ve KhronosUnlitMaterial sınıfları kullanılır. Adından da anlaşılacağı gibi, KhronosUnlitMaterials ışıklandırılmaz ve sahne ışıklandırmasından etkilenmez.
KhronosPbrMaterial, parlaklık rengi, bir nesnenin ne kadar metalik veya pürüzlü olduğu ve ışık yayıp yaymadığı gibi daha geniş bir özellik yelpazesini özelleştirmenize olanak tanır.
Desteklenen her mülk ve Android XR'deki özelleştirilebilir parametreler hakkında daha fazla bilgi için referans belgelerimize bakın. Bu özellikleri daha iyi anlamak için Khronos sözlüğüne bakın.
3D modelinizin malzeme özelliklerini özelleştirmek için önce KhronosPbrMaterial simgesini kullanarak yeni malzemeyi oluşturursunuz. Elde etmeye çalıştığınız görsel görünüm için uygun AlphaMode değerini ayarlamanız gerekir:
Ardından, değiştirmek istediğiniz özellikleri tanımlayın. Bu örnekte, ağın temel rengini mora değiştirmek için setBaseColorFactor kullanılıyor. Bu yöntem, Vector4 gerektirir. Burada x, y, z ve w bileşenleri sırasıyla RGBA (kırmızı, yeşil, mavi ve alfa) değerlerine karşılık gelir:
// Maintain a reference to the custom material to avoid re-creating it on every recomposition. var pbrMaterial by remember { mutableStateOf<KhronosPbrMaterial?>(null) } // Create and apply the custom material once the session is ready and the target node is available. LaunchedEffect(node) { val material = KhronosPbrMaterial.create( session = xrSession, alphaMode = AlphaMode.OPAQUE ).also { pbrMaterial = it // Apply a base color factor (RGBA) to change the color of the model. it.setBaseColorFactor( Vector4( x = 0.5f, y = 0.0f, z = 0.5f, w = 1.0f ) ) }
3D modeliniz için özel dokular yükleme
Texture, renk, ayrıntı veya diğer yüzey bilgilerini sağlamak için 3D modelin yüzeyine uygulayabileceğiniz bir resim öğesidir. Jetpack XR
Texture API, PNG dosyaları gibi resim verilerini uygulamanızın /assets/ klasöründen eşzamansız olarak yüklemenize olanak tanır.
Bir dokuyu yüklerken dokunun nasıl oluşturulacağını kontrol eden bir TextureSampler belirtebilirsiniz. Örnekleyici, filtreleme özelliklerini (doku orijinal boyutundan daha küçük veya daha büyük göründüğünde) ve sarmalama modlarını (standart [0, 1] aralığının dışındaki koordinatları işlemek için) tanımlar. 3D model üzerinde görsel efekt oluşturmak için Texture, KhronosPbrMaterial öğesine atanmalıdır.
Özel doku yüklemek için önce resim dosyasını /assets/ klasörünüze kaydetmeniz gerekir. En iyi uygulama olarak, bu klasörde bir textures
alt dizin de oluşturabilirsiniz.
Dosyayı uygun dizine kaydettikten sonra Texture API'si ile dokuyu oluşturun. Gerekirse isteğe bağlı bir TextureSampler de bu alana uygulanır.
Bu örnekte occlusion texture uygulanır ve occlusion yoğunluğu ayarlanır:
LaunchedEffect(node) { val material = KhronosPbrMaterial.create( session = xrSession, alphaMode = AlphaMode.OPAQUE ).also { pbrMaterial = it // Load a texture val texture = Texture.create( session = xrSession, path = Path("textures/texture_name.png") ) // Set the texture and configure occlusion to define how the material surface handles ambient lighting. it.setOcclusionTexture( texture = texture, strength = 1.0f ) } node?.setMaterialOverride( material = material ) }
3D nesnelerinize materyal ve doku uygulama
Yeni malzemeyi veya dokuyu uygulamak için glTF düğümünüzdeki belirli bir düğümün mevcut malzemesini geçersiz kılın. Bunun için setMaterialOverride numaralı telefonu arayın:
node?.setMaterialOverride( material = material )
Yeni oluşturulan materyalleri kaldırmak için daha önce geçersiz kılınan node üzerinde clearMaterialOverride işlevini çağırın. Bu işlem, 3D modelinizi varsayılan durumuna döndürür:
if (removeMaterial) { node?.clearMaterialOverride() }
glTF ve glTF logosu, Khronos Group Inc. şirketinin ticari markalarıdır.