افزودن مدل‌های سه‌بعدی به برنامه

دستگاه‌های XR قابل‌اعمال
این راهنمایی به شما کمک می‌کند برای این نوع دستگاه‌های واقعیت گسترده تجربه بسازید.
هدست‌های واقعیت گسترده
عینک واقعیت گسترده سیمی

هنگام کار با مدل‌های سه‌بعدی، «کیت توسعه نرم‌افزار Jetpack XR» از استاندارد باز glTF 2.0 پشتیبانی می‌کند. وقتی Android XR برنامه‌های ساخته‌شده با Jetpack XR SDK را پرداز می‌کند، مدل‌های سه‌بعدی با تکنیک‌های پردازش فیزیکی مبنا(PBR) مشخص‌شده در استاندارد glTF 2.0 (همراه با افزونه‌های پشتیبانی‌شده) پرداز می‌شوند. اکثر ابزارهای تولید محتوای دیجیتال (dcc)، مانند Autodesk Maya، Maxon ZBrush، Blender و Spline می‌توانند مدل‌های سه‌بعدی را به قالب glTF (فایل‌های .gltf یا .glb) صادر کنند.

اگر کاربر یا برنامه شما SpatialEnvironment آسمان‌نمایی را مشخص کرده باشد، مدل‌های سه‌بعدی با اطلاعات نورپردازی ارائه‌شده توسط آسمان‌نمای محیط روشن می‌شوند. مواد بازتابنده و نواحی پرنور و درخشان نیز آسمان‌نمای محیط را منعکس می‌کنند. اگر «گذردهی» فعال شده باشد، نورپردازی، انعکاس‌ها، و درخشش‌های آینه‌ای براساس اتاقی روشن با یک نور جهت‌دار خواهد بود.

برای نمای کلی سریع از مواد پشتیبانی‌شده، به ویژگی‌های glTF PBR در سایت Khronos مراجعه کنید. برای آشنایی با نحوه سفارشی‌سازی مدل‌های سه‌بعدی با این دارایی‌ها و دارایی‌های دیگر، سفارشی‌سازی مدل‌های سه‌بعدی در برنامه را ببینید

افزودن فایل glTF به پوشه دارایی‌ها

پس‌از اینکه فایل glTF را تهیه کردید، مرحله بعدی افزودن آن به فهرست دارایی‌ها در Android Studio است. توصیه می‌کنیم یک دایرکتوری models ایجاد کنید تا انواع دارایی‌هایتان را بهتر سازمان‌دهی کنید.

نمونه افزودن دارایی‌ها به پوشه /models

افزودن شیء سه‌بعدی بااستفاده از SpatialGltfModel

‫Android XR از قالب glTF برای مدل‌های سه‌بعدی پشتیبانی می‌کند که معمولاً به‌صورت فایل‌های .glb ذخیره می‌شوند. برای افزودن این اشیا به چیدمان، از SpatialGltfModel عنصر ترکیبی استفاده کنید. این API فرایند بار کردن دارایی‌ها و مدیریت وضعیت آن‌ها را ساده می‌کند.

برای نمایش مدل، ابتدا منبع و وضعیت آن را بااستفاده از rememberSpatialGltfModelState تعریف کنید. می‌توانید مدل‌ها را از پوشه assets برنامه، URI، یا raw data بار کنید.

val modelState = rememberSpatialGltfModelState(
    source = SpatialGltfModelSource.fromPath(
        Paths.get("models/model_name.glb")
    )
)

پس‌از تعریف وضعیت، از عنصر ترکیبی SpatialGltfModel برای پرداز کردن آن در فضای فرعی استفاده کنید.

SpatialGltfModel(state = modelState, modifier = SubspaceModifier)

قرار دادن مدل سه‌بعدی بااستفاده از Compose SceneCoreEntity

برای قرار دادن مدل سه‌بعدی بااستفاده از SceneCoreEntity، ابتدا باید بااستفاده از GltfModel.create()،‏ glTF را در حافظه بار کنید. سپس می‌توانید مدل سه‌بعدی را در SceneCoreEntity قرار دهید تا اجزای SceneCore را با چیدمان‌های Compose for XR پیوند دهید. به استفاده از SceneCoreEntity برای قرار دادن شیء سه‌بعدی در چیدمان مراجعه کنید.

قرار دادن مدل سه‌بعدی بااستفاده از Jetpack Scenecore

برای بار کردن مدل glTF، با GltfModel.create() تماس بگیرید.

val gltfModel = GltfModel.create(session, Paths.get("models", "saturn_rings.glb"))

در این مرحله، مدل در حافظه بارگذاری می‌شود، اما هنوز رندر نشده است. اگر مدل‌های سه‌بعدی زیادی برای بار کردن دارید یا مدل شما بزرگ است، بهتر است آن‌ها را ازقبل به‌صورت ناهمزمان بار کنید. به این ترتیب، کاربران مجبور نیستند منتظر بمانند تا مدل‌های شما در حافظه بار شود.

‫glTF را به ActivitySpace اضافه کنید. برای ایجاد نهاد و قرار دادن آن در ActivitySpace، GltfModelEntity.create را فراخوانی کنید. به‌عنوان روال مطلوب، باید بررسی کنید که برنامه در وضعیتی باشد که امکان استفاده از قابلیت‌های فضایی را فراهم کند.

if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_3D_CONTENT)) {
    val gltfEntity = GltfModelEntity.create(session, gltfModel)
}

اکنون باید مدل سه‌بعدی بارگذاری‌شده را هنگام اجرای برنامه ببینید.

نمونه‌ای از مدل سه‌بعدی بارشده

بار کردن مدل سه‌بعدی بااستفاده از «بازدیدکننده صحنه»

اگر به‌دنبال ساده‌ترین راه برای بار کردن مدل سه‌بعدی با قابلیت‌های تعامل اولیه هستید، می‌توانید از «نمایشگر صحنه» همان‌طور که در تلفن همراه استفاده می‌کنید استفاده کنید. تفاوت اصلی بین «نمایشگر صحنه» در Android XR و در تلفن همراه این است که «نمایشگر صحنه» فقط از پارامتر URI فایل که به فایل glTF اشاره می‌کند پشتیبانی می‌کند و همه پارامترهای دیگر نادیده گرفته می‌شوند.

«نمایشگر صحنه» برنامه جداگانه‌ای است که بااستفاده از هدف فراخوانی می‌شود و در «حالت فضای کامل» اجرا می‌شود. درنتیجه، وقتی آن را فراخوانی می‌کنید، برنامه شما دیگر قابل‌مشاهده نخواهد بود و Scene Viewer تمرکز خواهد داشت. هر محیطی را که تغییر داده باشید به اولویت‌های سیستم کاربر بازنشانی خواهد شد.

در اینجا مثالی از استفاده از Intent برای مشاهده فایل glTF در «بازدیدکننده صحنه» در Android XR آورده شده است:

val url =
    "https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/Avocado/glTF/Avocado.gltf"
val sceneViewerIntent = Intent(Intent.ACTION_VIEW)
val intentUri =
    Uri.parse("https://arvr.google.com/scene-viewer/1.2")
        .buildUpon()
        .appendQueryParameter("file", url)
        .build()
sceneViewerIntent.setData(intentUri)
try {
    startActivity(sceneViewerIntent)
} catch (e: ActivityNotFoundException) {
    // There is no activity that could handle the intent.
}

برای اطلاعات بیشتر درباره گزینه‌های تعاملی بودن «نمایشگر صحنه»، به اسناد طراحی مدل سه‌بعدی ما مراجعه کنید.

افزونه‌های glTF

«کیت توسعه نرم‌افزار Jetpack XR» از چندین افزونه glTF که قابلیت‌های مدل‌های سه‌بعدی را گسترش می‌دهند پشتیبانی می‌کند. این قابلیت‌ها ازطریق هر دو GltfModelEntity و «نمایشگر صحنه» دردسترس است.