আপনার অ্যাপে 3D মডেল কাস্টমাইজ করুন

প্রযোজ্য এক্সআর ডিভাইস
এই নির্দেশিকা আপনাকে এই ধরনের এক্সআর ডিভাইসগুলির জন্য অভিজ্ঞতা তৈরি করতে সাহায্য করে।
এক্সআর হেডসেট
তারযুক্ত এক্সআর চশমা

একটি 3D মডেল কাস্টমাইজ করার আগে, আপনাকে প্রথমে এটি আপনার অ্যাপে যুক্ত করতে হবে। আপনার অ্যাপে 3D মডেলটি যুক্ত করার পরে, আপনি মডেলটির চেহারা এবং নড়াচড়া কাস্টমাইজ করে এর ভিজ্যুয়াল এবং ইন্টারেক্টিভ অভিজ্ঞতা উন্নত করতে পারেন।

উদাহরণস্বরূপ, আপনি এমবেডেড glTF অ্যানিমেশনগুলো প্লে ও নিয়ন্ত্রণ করতে পারেন, আপনার মডেল গঠনকারী নোডগুলো অ্যাক্সেস ও মুভ করতে পারেন, এমনকি কাস্টম টেক্সচার লোড করে এবং ইন্টারনাল মেশগুলোকে ওভাররাইড করার জন্য ম্যাটেরিয়াল প্রোপার্টি নির্ধারণ করতে পারেন। এই সক্ষমতাগুলো আপনাকে রানটাইমে কোনো অবজেক্টের চেহারা ও আচরণ গতিশীলভাবে পরিবর্তন করার সুযোগ দেয়।

অ্যান্ড্রয়েড এক্সআর-এ 3D বস্তু

Jetpack XR SDK, 3D মডেলের জন্য Khronos Group-এর glTF 2.0 ওপেন স্ট্যান্ডার্ড সমর্থন করে এবং glTF 2.0 স্ট্যান্ডার্ডে উল্লেখিত ফিজিক্যালি বেসড রেন্ডারিং (PBR) কৌশল (সমর্থিত এক্সটেনশন সহ) ব্যবহার করে এই অবজেক্টগুলোকে রেন্ডার করে। glTF (গ্রাফিক্স লাইব্রেরি ট্রান্সমিশন ফরম্যাট) হলো 3D সিন এবং মডেল প্রেরণ ও লোড করার জন্য একটি স্ট্যান্ডার্ড ফাইল ফরম্যাট। একটি glTF মডেল অভ্যন্তরীণ উপাদানগুলোর একটি স্তরক্রমিক কাঠামো দ্বারা গঠিত।

বোঝার জন্য মূল উপাদানগুলো হলো:

  • নোড : এগুলো মডেলের কাঠামো এবং স্তরবিন্যাস নির্ধারণ করে। প্রতিটি নোডের নিজস্ব অবস্থান, ঘূর্ণন এবং স্কেল থাকতে পারে।
  • মেশ : কাঠামোগত, ত্রিমাত্রিক জ্যামিতি যা একটি ত্রিমাত্রিক বস্তুর আকৃতি গঠন করে।
  • উপাদানসমূহ : এগুলো মেশগুলোর বাহ্যিক রূপ নির্ধারণ করে , যেমন তাদের রঙ, অমসৃণতা বা আলোর প্রতি তাদের প্রতিক্রিয়া।
  • টেক্সচার : একটি ইমেজ অ্যাসেট, যেমন একটি PNG ফাইল, যা আপনি একটি 3D মডেলের পৃষ্ঠে প্রয়োগ করে নিজস্ব প্যাটার্ন, রঙ, বিস্তারিত বিবরণ বা অন্যান্য ভিজ্যুয়াল ইফেক্ট তৈরি করতে পারেন।
  • অ্যানিমেশন : এগুলো হলো পূর্বনির্ধারিত ক্রম বা অ্যানিমেশন ট্র্যাক , যাতে সময়ের সাথে সাথে গতিশীলতার আবহ তৈরি করার জন্য স্বতন্ত্র নোড এবং মেশের পরিবর্তন অন্তর্ভুক্ত থাকে।

Jetpack Compose for XR-এ, আপনি SpatialGltfModel ব্যবহার করে এই ফাইলগুলি রেন্ডার করেন এবং SpatialGltfModelState ব্যবহার করে এর লোডিং ও অ্যানিমেশন স্ট্যাটাস ট্র্যাক করেন। আরও তথ্যের জন্য, আপনার অ্যাপে 3D মডেল যোগ করুন দেখুন।

3D মডেলগুলিকে অ্যানিমেট করুন

3D মডেলে এমবেডেড অ্যানিমেশন থাকতে পারে। অভ্যন্তরীণভাবে, অ্যানিমেশনগুলো কোনো নড়াচড়ার সময় ও মান নির্ধারণ করতে স্যাম্পলার এবং সেই নড়াচড়াগুলোকে স্বতন্ত্র নোড ও মেশের সাথে সংযুক্ত করতে চ্যানেল ব্যবহার করে। KHR_animation_pointer glTF এক্সটেনশন দিয়ে তৈরি স্কেলেটাল অ্যানিমেশন এবং ম্যাটেরিয়াল অ্যানিমেশন Jetpack XR SDK-তে সমর্থিত।

Compose for XR ব্যবহার করে একটি অ্যানিমেশন চালাতে, animations তালিকা থেকে নির্দিষ্ট ট্র্যাকের নামটি উল্লেখ করুন। প্লে করা শুরু করতে animation.start() ব্যবহার করুন। ঐচ্ছিকভাবে, আপনি SpatialGltfModelAnimation ব্যবহার করে গতি, সিক টাইম এবং অ্যানিমেশনটি লুপ হবে কি না তা নির্দিষ্ট করতে পারেন।

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()
    }
}

নোড পরিচালনা: ভঙ্গি এবং ঘূর্ণন

একটি মডেলের নির্দিষ্ট অংশ পরিচালনা করতে এবং এর ঘূর্ণন বা ভঙ্গির মতো বৈশিষ্ট্য পরিবর্তন করতে, আপনাকে SpatialGltfModelState ব্যবহার করে glTF মডেলের অভ্যন্তরীণ nodes কোয়েরি করতে হবে।

// 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" }

সঠিক নোডটি খুঁজে পাওয়ার পর, আপনি এর তাৎক্ষণিক প্যারেন্ট GltfModelNode এর সাপেক্ষে এর ত্রিমাত্রিক অবস্থান এবং ঘূর্ণন পরিবর্তন করতে এর localPose সেট করতে পারেন, অথবা GltfModelEntity রুটের সাপেক্ষে অবস্থান নির্ধারণ করতে modelPose ব্যবহার করতে পারেন। একইভাবে, আপনি এর প্যারেন্ট বা রুটের সাপেক্ষে মডেলটির স্কেল পরিবর্তন করতে localScale/modelScale ব্যবহার করতে পারেন।

LaunchedEffect(node, degrees) {
    val rotation = Quaternion.fromEulerAngles(degrees, 0f, degrees)
    node?.let {
        it.localPose = Pose(it.localPose.translation, rotation)
    }
}

আপনার 3D মডেলের উপাদানের বৈশিষ্ট্যগুলি কাস্টমাইজ করুন

ব্যবহারকারীর ইনপুট বা অ্যাপের বর্তমান অবস্থার উপর ভিত্তি করে কোনো অবজেক্টের চেহারা গতিশীলভাবে পরিবর্তন করতে আপনি রানটাইমে মেটেরিয়াল অ্যাট্রিবিউটগুলো সমন্বয় করতে পারেন।

Jetpack XR-এ, এই ম্যাটেরিয়ালগুলো তৈরি ও পরিবর্তন করার জন্য KhronosPbrMaterial এবং KhronosUnlitMaterial ক্লাসগুলো ব্যবহার করা হয়। নাম থেকেই বোঝা যায়, KhronosUnlitMaterials আলোহীন এবং দৃশ্যের আলো দ্বারা প্রভাবিত হয় না। KhronosPbrMaterial আপনাকে আরও বিস্তৃত পরিসরের বৈশিষ্ট্য কাস্টমাইজ করার সুযোগ দেয়, যেমন—শীনের রঙ, কোনো বস্তু কতটা ধাতব বা অমসৃণ হবে এবং সেটি আলো নির্গত করবে কি না।

Android XR-এর প্রতিটি সমর্থিত প্রপার্টি এবং কাস্টমাইজযোগ্য প্যারামিটার সম্পর্কে আরও তথ্যের জন্য, আমাদের রেফারেন্স ডকুমেন্টেশন দেখুন। এই প্রপার্টিগুলো আরও ভালোভাবে বোঝার জন্য, ক্রোনোস গ্লসারি দেখুন।

চিত্র ১. একটি ৩ডি মডেলের মূল রং পরিবর্তনের উদাহরণ।

আপনার 3D মডেলের ম্যাটেরিয়াল প্রোপার্টি কাস্টমাইজ করতে, প্রথমে আপনাকে KhronosPbrMaterial ব্যবহার করে নতুন ম্যাটেরিয়ালটি তৈরি করতে হবে। আপনি যে ভিজ্যুয়াল অ্যাপিয়ারেন্সটি অর্জন করতে চাইছেন, তার জন্য আপনাকে উপযুক্ত AlphaMode সেট করতে হবে:

এরপর, আপনি যে প্রোপার্টিগুলো পরিবর্তন করতে চান, সেগুলো নির্ধারণ করুন। এই উদাহরণে, মেশের বেস কালার বেগুনিতে পরিবর্তন করার জন্য setBaseColorFactor ব্যবহার করা হয়েছে। এই মেথডটির জন্য একটি Vector4 প্রয়োজন, যেখানে x, y, z , এবং w কম্পোনেন্টগুলো যথাক্রমে RGBA (রেড, গ্রিন, ব্লু, এবং আলফা) ভ্যালুগুলোর সাথে সঙ্গতিপূর্ণ:

// 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 মডেলের জন্য কাস্টম টেক্সচার লোড করুন

Texture হলো একটি ইমেজ অ্যাসেট যা আপনি একটি 3D মডেলের পৃষ্ঠে রঙ, বিবরণ বা অন্যান্য পৃষ্ঠের তথ্য যোগ করার জন্য প্রয়োগ করতে পারেন। Jetpack XR টেক্সচার API আপনাকে আপনার অ্যাপের /assets/ ফোল্ডার থেকে PNG ফাইলের মতো ইমেজ ডেটা অ্যাসিঙ্ক্রোনাসভাবে লোড করতে দেয়।

একটি টেক্সচার লোড করার সময়, আপনি একটি TextureSampler নির্দিষ্ট করতে পারেন, যা টেক্সচারটি কীভাবে রেন্ডার করা হবে তা নিয়ন্ত্রণ করে। স্যাম্পলারটি ফিল্টারিং বৈশিষ্ট্য (টেক্সচারটি তার আসল আকারের চেয়ে ছোট বা বড় দেখানোর জন্য) এবং র‍্যাপিং মোড (স্ট্যান্ডার্ড [0, 1] পরিসরের বাইরের স্থানাঙ্কগুলি পরিচালনা করার জন্য) নির্ধারণ করে। একটি 3D মডেলে ভিজ্যুয়াল ইফেক্ট আনার জন্য একটি Texture অবশ্যই একটি KhronosPbrMaterial এর সাথে অ্যাসাইন করতে হবে।

চিত্র ২. একটি ৩ডি মডেলের টেক্সচার পরিবর্তনের উদাহরণ।

কাস্টম টেক্সচার লোড করতে, প্রথমে আপনাকে ইমেজ ফাইলটি আপনার /assets/ ফোল্ডারে সেভ করতে হবে। উত্তম অনুশীলন হিসেবে, আপনি ওই ফোল্ডারে একটি textures সাবডিরেক্টরিও তৈরি করতে পারেন।

উপযুক্ত ডিরেক্টরিতে ফাইলটি সেভ করার পর, Texture API) ব্যবহার করে টেক্সচারটি তৈরি করুন। প্রয়োজন হলে, এখানেই একটি ঐচ্ছিক TextureSampler প্রয়োগ করতে হবে।

এই উদাহরণটি একটি অক্লুশন টেক্সচার প্রয়োগ করে এবং অক্লুশন স্ট্রেংথ নির্ধারণ করে:

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 অবজেক্টগুলিতে ম্যাটেরিয়াল এবং টেক্সচার প্রয়োগ করুন।

নতুন মেটেরিয়াল বা টেক্সচার প্রয়োগ করতে, আপনার glTF নোডের একটি নির্দিষ্ট নোডের জন্য বিদ্যমান মেটেরিয়ালটিকে ওভাররাইড করুন। এটি করার জন্য setMaterialOverride কল করুন:

node?.setMaterialOverride(
    material = material
)

নতুন তৈরি করা ম্যাটেরিয়ালগুলো অপসারণ করতে, পূর্বে ওভাররাইড করা নোডটিতে clearMaterialOverride কল করুন। এটি আপনার 3D মডেলকে তার ডিফল্ট অবস্থায় ফিরিয়ে দেবে:

if (removeMaterial) {
    node?.clearMaterialOverride()
}


glTF এবং glTF লোগো হলো ক্রোনোস গ্রুপ ইনকর্পোরেটেডের ট্রেডমার্ক।