3D মডেল কাস্টমাইজ করার আগে, আপনাকে প্রথমে সেটি অ্যাপে যোগ করতে হবে। আপনার অ্যাপে 3D মডেল যোগ করার পরে, 3D মডেলটি কেমন দেখতে হবে এবং কীভাবে সরবে তা কাস্টমাইজ করে আপনি ভিজ্যুয়াল ও ইন্ট্যার্যাক্টিভ অভিজ্ঞতা উন্নত করতে পারবেন।
যেমন, আপনি এম্বেড করা glTF অ্যানিমেশন চালাতে ও কন্ট্রোল করতে, আপনার মডেল তৈরি করা নোড অ্যাক্সেস ও সরাতে অথবা ইন্টার্নাল মেশ ওভাররাইড করতে কাস্টম টেক্সচার লোড ও মেটেরিয়াল প্রপার্টি নির্ধারণ করতে পারবেন। এইসব ক্ষমতা আপনাকে রানটাইমে কোনও অবজেক্টের আচরণ ও চেহারা ডায়নামিক পরিবর্তন করতে দেয়।
Android XR-এ ত্রিমাত্রিক অবজেক্ট
Jetpack XR SDK, 3D মডেলের জন্য Khronos Group-এর glTF 2.0 ওপেন স্ট্যান্ডার্ড মেনে চলে এবং glTF 2.0 স্ট্যান্ডার্ডে (এর সাথে কাজ করে এমন এক্সটেনশন) নির্দিষ্ট করা ফিজিক্যালি বেসড রেন্ডারিং (PBR) টেকনিকের মাধ্যমে এইসব অবজেক্ট রেন্ডার করে। A glTF (গ্রাফিক্স লাইব্রেরি ট্রান্সমিশন ফর্ম্যাট) হল 3D সিন ও মডেল ট্রান্সমিট ও লোড করার একটি স্ট্যান্ডার্ড ফাইল ফর্ম্যাট। glTF মডেলটি ইন্টার্নাল কম্পোনেন্টগুলির হায়ারার্কিক্যাল স্ট্রাকচার দিয়ে তৈরি।
বোঝার জন্য মূল উপাদানগুলি এখানে দেওয়া হল:
- নোড: এগুলি মডেলের গঠন ও হায়ারার্কি নির্ধারণ করে। প্রতিটি নোডের নিজস্ব পজিশন, রোটেশন ও স্কেল থাকতে পারে।
- মেশ: 3D অবজেক্টের আকার তৈরি করা স্ট্রাকচারাল, 3D জ্যামিতি।
- মেটেরিয়াল: এগুলি মেসের ভিজ্যুয়াল অ্যাপিয়ারেন্সকে সংজ্ঞায়িত করে, যেমন তাদের রঙ, রাফনেস বা কীভাবে তারা আলোর সাথে প্রতিক্রিয়া দেখায়।
- টেক্সচার: PNG ফাইলের মতো একটি ইমেজ অ্যাসেট যা আপনি কাস্টম প্যাটার্ন, রঙ, বিবরণ বা অন্যান্য ভিজ্যুয়াল এফেক্ট তৈরি করতে 3D মডেলের সারফেসে প্রয়োগ করতে পারেন।
XR-এর জন্য Jetpack Compose-এ, আপনি SpatialGltfModel ব্যবহার করে এইসব ফাইল রেন্ডার করেন
এবং SpatialGltfModelState ব্যবহার করে এর লোডিং স্ট্যাটাস ট্র্যাক করেন।
আরও তথ্যের জন্য, আপনার অ্যাপে 3D মডেল যোগ করুন দেখুন।
নোড ম্যানিপুলেট করা: পোজ ও রোটেশন
মডেলের নির্দিষ্ট অংশ ম্যানিপুলেট করতে এবং এর প্রপার্টি পরিবর্তন করতে, যেমন রোটেশন
বা পোজ, আপনাকে nodes ব্যবহার করে glTF মডেলের ইন্টার্নাল SpatialGltfModelState কোয়েরি করতে হবে।
// 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" }
সঠিক নোড খুঁজে পাওয়ার পরে, এর localPose সেট করে এর 3D
পজিশন ও রোটেশনকে এর অবিলম্বে প্যারেন্ট GltfModelNode-এর সাপেক্ষে পরিবর্তন করতে পারেন অথবা
modelPose ব্যবহার করে পজিশনকে
GltfModelEntity রুটের সাপেক্ষে সেট করতে পারেন। একইভাবে, আপনি 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-এ কাজ করে এমন প্রতিটি প্রপার্টি এবং কাস্টমাইজ করা যায় এমন প্যারামিটার সম্পর্কে আরও জানতে, আমাদের রেফারেন্স ডকুমেন্টেশন দেখুন। এইসব প্রপার্টি আরও ভালভাবে বুঝতে, Khronos পরিভাষা দেখুন।
আপনার 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
Texture API আপনাকে PNG ফাইলের মতো ইমেজ ডেটা, আপনার অ্যাপের
/assets/ ফোল্ডার থেকে অ্যাসিঙ্ক্রোনাসভাবে লোড করতে দেয়।
টেক্সচার লোড করার সময়, আপনি TextureSampler নির্দিষ্ট করতে পারবেন, যা টেক্সচার কীভাবে রেন্ডার করা হবে তা কন্ট্রোল করে।
স্যাম্পলার ফিল্টার করার প্রপার্টি (টেক্সচার যখন
সেটির আসল সাইজের চেয়ে ছোট বা বড় দেখায়) এবং র্যাপিং মোড
(স্ট্যান্ডার্ড [0, 1] রেঞ্জের বাইরে কোঅর্ডিনেট ম্যানেজ করার জন্য) নির্ধারণ করে। 3D মডেলে ভিজ্যুয়াল এফেক্ট পেতে হলে KhronosPbrMaterial-এ Texture অ্যাসাইন
করতেই হবে।
কাস্টম টেক্সচার লোড করতে, প্রথমে আপনাকে ইমেজ ফাইলটি নিজের
/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() }
3D মডেল অ্যানিমেট করা
3D মডেলে এম্বেড করা অ্যানিমেশন থাকতে পারে। অভ্যন্তরীণভাবে, অ্যানিমেশন
স্যাম্পলার ব্যবহার করে মুভমেন্টের সময় ও ভ্যালু এবং
চ্যানেল ব্যবহার করে সেইসব মুভমেন্টকে আলাদা আলাদা নোড ও
মেশের সাথে কানেক্ট করে। Jetpack XR SDK-তে
KHR_animation_pointer glTF এক্সটেনশন ব্যবহার করে তৈরি করা কঙ্কাল সম্পর্কিত অ্যানিমেশন ও মেটেরিয়াল অ্যানিমেশন
কাজ করে।
SceneCore-এর GltfAnimation-এর সাথে
GltfModelEntity ব্যবহার করেই শুধু অ্যানিমেশন কন্ট্রোল করা যায়। Compose for XR লেআউটে এই এন্টিটি যোগ করতে,
আপনাকে SpatialGltfModel-এর পরিবর্তে SceneCoreEntity ব্যবহার করতে হবে।
আপনার GltfModelEntity-এ animations-এর তালিকা থেকে নির্দিষ্ট ট্র্যাকের নাম উল্লেখ করুন।
অ্যানিমেশন প্লেব্যাক কন্ট্রোল করতে
GltfAnimationStartOptions ব্যবহার করুন। ঐচ্ছিকভাবে,
আপনি স্পিড, সিক টাইম এবং অ্যানিমেশন
লুপ করা উচিত কিনা তা নির্দিষ্ট করতে পারেন:
val animation = gltfEntity.getAnimations().find { it.name == "Walk" } animation?.start(GltfAnimationStartOptions(shouldLoop = true))
glTF এবং glTF লোগো হল Khronos Group Inc.-এর ট্রেডমার্ক।