مدل های سه بعدی را به برنامه خود اضافه کنید

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

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

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

برای مرور سریع مطالب پشتیبانی شده، به glTF PBR Properties در سایت Khronos مراجعه کنید.

دو روش اصلی برای برنامه‌های ساخته شده با Jetpack XR SDK برای بارگذاری مدل‌های سه‌بعدی وجود دارد.

یک مدل سه‌بعدی را در ActivitySpace قرار دهید

وقتی فایل glTF خود را ایجاد کردید، مرحله بعدی اضافه کردن آن به دایرکتوری assets در اندروید استودیو است. توصیه می‌کنیم برای سازماندهی بهتر انواع asset، یک دایرکتوری models ایجاد کنید.

مثالی از افزودن دارایی‌ها به دایرکتوری /models

برای بارگذاری مدل 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)
}

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

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

یک مدل سه‌بعدی را در یک Compose SceneCoreEntity قرار دهید

اگرچه هنوز نیاز دارید که glTF را با استفاده از GltfModel.create() در حافظه بارگذاری کنید، اما اگر رابط کاربری خود را با Jetpack Compose برای XR ایجاد می‌کنید، می‌توانید مدل‌های سه‌بعدی را در SceneCoreEntity قرار دهید. برای قرار دادن یک شیء سه‌بعدی در طرح‌بندی خود، به بخش «استفاده از SceneCoreEntity» مراجعه کنید.

متحرک‌سازی مدل‌های سه‌بعدی

به عنوان بخشی از مشخصات glTF، مدل‌های سه‌بعدی می‌توانند انیمیشن‌های تعبیه‌شده داشته باشند. انیمیشن‌های اسکلتی (ریگ‌شده)، صلب و morph target (ترکیب اشکال) همگی در Jetpack XR SDK پشتیبانی می‌شوند. انیمیشن‌های متریال ایجاد شده با افزونه glTF KHR_animation_pointer نیز پشتیبانی می‌شوند.

برای پخش یک انیمیشن، تابع startAnimation() را فراخوانی کرده و نام انیمیشن را مشخص کنید. می‌توانید به صورت اختیاری مشخص کنید که آیا انیمیشن باید به طور نامحدود تکرار شود یا خیر.

gltfEntity.startAnimation(loop = true, animationName = "Walk")

با فراخوانی startAnimation برای بار دوم، انیمیشن فعلی متوقف شده و انیمیشن جدید شروع می‌شود.

شما می‌توانید وضعیت فعلی انیمیشن را از طریق getAnimationState() بررسی کنید.

اگر نام انیمیشن مشخص شده هنگام فراخوانی startAnimation() وجود نداشته باشد، فراخوانی بی‌صدا با شکست مواجه می‌شود، هر انیمیشن در حال اجرا متوقف می‌شود و getAnimationState() STOPPED برمی‌گرداند.

بارگذاری یک مدل سه‌بعدی با استفاده از Scene Viewer

اگر به دنبال ساده‌ترین راه برای بارگذاری یک مدل سه‌بعدی با قابلیت‌های تعاملی اولیه هستید، می‌توانید از Scene Viewer مانند آنچه در موبایل استفاده می‌کنید، استفاده کنید . یک تفاوت کلیدی بین Scene Viewer در اندروید XR و موبایل این است که Scene Viewer فقط از پارامتر URI فایل که به فایل glTF اشاره می‌کند پشتیبانی می‌کند و سایر پارامترها نادیده گرفته می‌شوند.

Scene Viewer یک برنامه جداگانه است که با استفاده از یک intent فراخوانی می‌شود و در حالت Full Space اجرا می‌شود. در نتیجه، وقتی آن را فراخوانی می‌کنید، برنامه شما دیگر قابل مشاهده نخواهد بود و Scene Viewer فوکوس خواهد داشت. هر محیطی که ممکن است تغییر داده باشید، به تنظیمات سیستم کاربر بازنشانی می‌شود.

در اینجا مثالی از استفاده از Intent برای مشاهده فایل glTF در Scene Viewer در اندروید 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.
}

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

افزونه‌های glTF

کیت توسعه نرم‌افزار Jetpack XR از چندین افزونه gfTF پشتیبانی می‌کند که قابلیت‌های مدل‌های سه‌بعدی را گسترش می‌دهند. این قابلیت‌ها از طریق GltfModelEntity و Scene Viewer در دسترس هستند.