সত্তা তৈরি করুন, নিয়ন্ত্রণ করুন এবং পরিচালনা করুন

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

Jetpack XR SDK আপনাকে Jetpack SceneCore ব্যবহার করে 3D মডেল , স্টেরিওস্কোপিক ভিডিও এবং PanelEntity এর মতো Entity ইনস্ট্যান্স তৈরি, নিয়ন্ত্রণ এবং পরিচালনা করতে দেয়।

Jetpack SceneCore 3D ডেভেলপমেন্টকে সমর্থন করার জন্য দুটি প্রচলিত আর্কিটেকচারাল প্যাটার্ন গ্রহণ করে: একটি সিন গ্রাফ এবং একটি এনটিটি-কম্পোনেন্ট সিস্টেম (ECS)।

এনটিটি তৈরি ও নিয়ন্ত্রণ করতে সিন গ্রাফ ব্যবহার করুন।

3D স্পেসে অবজেক্ট তৈরি ও নিয়ন্ত্রণ করতে, আপনি Jetpack SceneCore-এর সেশন API ব্যবহার করে সিন গ্রাফে অ্যাক্সেস পেতে পারেন। সিন গ্রাফটি ব্যবহারকারীর বাস্তব জগতের সাথে সামঞ্জস্যপূর্ণ থাকে এবং আপনাকে প্যানেল ও 3D মডেলের মতো 3D সত্তাগুলোকে একটি শ্রেণিবদ্ধ কাঠামোতে সাজাতে ও সেই সত্তাগুলোর অবস্থা ধরে রাখতে সাহায্য করে।

একবার সিন গ্রাফে অ্যাক্সেস পেয়ে গেলে, আপনি Jetpack Compose for XR-এর API ব্যবহার করে সিন গ্রাফের মধ্যে স্পেশিয়াল UI (যেমন, SpatialPanel এবং Orbiter ইনস্ট্যান্স) তৈরি করতে পারবেন। 3D মডেলের মতো 3D কন্টেন্টের জন্য, আপনি সরাসরি সেশনে অ্যাক্সেস করতে পারেন। আরও জানতে, এই পৃষ্ঠার ‘ActivitySpace সম্পর্কে’ অংশটি দেখুন।

সত্তা উপাদান সিস্টেম

একটি এনটিটি কম্পোনেন্ট সিস্টেম ইনহেরিটেন্সের পরিবর্তে কম্পোজিশনের নীতি অনুসরণ করে। আপনি বিহেভিয়ার-ডিফাইনিং কম্পোনেন্ট সংযুক্ত করে এনটিটিগুলোর আচরণকে প্রসারিত করতে পারেন, যা আপনাকে বিভিন্ন ধরণের এনটিটিতে একই আচরণ প্রয়োগ করার সুযোগ দেয়। আরও তথ্যের জন্য, এই পৃষ্ঠায় ‘এনটিটিতে সাধারণ আচরণ যোগ করুন’ অংশটি দেখুন।

অ্যাক্টিভিটিস্পেস সম্পর্কে

প্রতিটি Session একটি ActivitySpace থাকে যা Session সাথে স্বয়ংক্রিয়ভাবে তৈরি হয়। ActivitySpace হলো সিন গ্রাফের শীর্ষ-স্তরের Entity

অ্যাক্টিভিটিস্পেস একটি ত্রি-মাত্রিক স্থানকে বোঝায়, যা একটি ডান-হাতি স্থানাঙ্ক ব্যবস্থা (যেখানে x-অক্ষ ডানদিকে, y-অক্ষ উপরের দিকে এবং z-অক্ষ মূলবিন্দুর সাপেক্ষে পেছনের দিকে নির্দেশ করে) এবং বাস্তব জগতের সাথে সামঞ্জস্য রেখে মিটার একক ব্যবহার করে। ActivitySpace মূলবিন্দুটি কিছুটা ইচ্ছাধীন (কারণ ব্যবহারকারীরা বাস্তব জগতে ActivitySpace অবস্থান পুনরায় সেট করতে পারেন), তাই মূলবিন্দুর সাপেক্ষে না করে, বিষয়বস্তুগুলোকে একে অপরের সাপেক্ষে স্থাপন করার পরামর্শ দেওয়া হয়।

সংস্থাগুলির সাথে কাজ করুন

সিনকোর-এর কেন্দ্রবিন্দুতে রয়েছে এনটিটি। ব্যবহারকারী যা কিছু দেখেন এবং যার সাথে মিথস্ক্রিয়া করেন, তার প্রায় সবকিছুই হলো এনটিটি, যা প্যানেল, থ্রিডি মডেল এবং আরও অনেক কিছুর প্রতিনিধিত্ব করে।

যেহেতু ActivitySpace হলো সিন গ্রাফের শীর্ষ-স্তরের নোড, তাই ডিফল্টরূপে সমস্ত নতুন এনটিটি সরাসরি ActivitySpace মধ্যে স্থাপন করা হয়। আপনি এর parent সেট করে অথবা addChild() ব্যবহার করে সিন গ্রাফ বরাবর এনটিটিগুলোর স্থান পরিবর্তন করতে পারেন।

অবস্থান পরিবর্তন, ঘূর্ণন বা দৃশ্যমানতার মতো বিষয়গুলোর জন্য এনটিটিগুলোর কিছু ডিফল্ট আচরণ থাকে, যা সব এনটিটির ক্ষেত্রেই প্রযোজ্য। নির্দিষ্ট Entity সাবক্লাস, যেমন GltfModelEntity , এর অতিরিক্ত আচরণ থাকে যা সেই সাবক্লাসটিকে সমর্থন করে।

সত্তা পরিচালনা করুন

যখন আপনি মূল Entity ক্লাসের অন্তর্গত কোনো Entity প্রপার্টিতে পরিবর্তন করেন, তখন সেই পরিবর্তনটি তার সমস্ত চাইল্ডের উপরও প্রভাব ফেলে। উদাহরণস্বরূপ, একটি প্যারেন্ট EntityPose পরিবর্তন করলে তার সমস্ত চাইল্ডেও একই পরিবর্তন ঘটে। একটি চাইল্ড Entity তে পরিবর্তন করলে তা তার প্যারেন্টকে প্রভাবিত করে না।

একটি Pose ত্রিমাত্রিক স্থানে এনটিটির অবস্থান এবং ঘূর্ণনকে উপস্থাপন করে। অবস্থানটি হলো একটি Vector3 যা x, y, z সাংখ্যিক অবস্থান নিয়ে গঠিত। ঘূর্ণনটি একটি Quaternion দ্বারা উপস্থাপিত হয়। একটি Entity অবস্থান সর্বদা তার প্যারেন্ট এনটিটির সাপেক্ষে নির্ধারিত হয়। অন্য কথায়, যে Entity অবস্থান (0, 0, 0), তাকে তার প্যারেন্ট এনটিটির মূলবিন্দুতে স্থাপন করা হবে।

// Place the entity forward 2 meters
val newPosition = Vector3(0f, 0f, -2f)
// Rotate the entity by 180 degrees on the up axis (upside-down)
val newOrientation = Quaternion.fromEulerAngles(0f, 0f, 180f)
// Update the position and rotation on the entity
entity.setPose(Pose(newPosition, newOrientation))

কোনো Entity নিষ্ক্রিয় করতে, setEnabled() ব্যবহার করুন। এটি এটিকে অদৃশ্য করে তোলে এবং এর উপর সম্পাদিত সমস্ত প্রক্রিয়াকরণ বন্ধ করে দেয়।

// Disable the entity.
entity.setEnabled(false)

কোনো Entity সামগ্রিক আকৃতি অপরিবর্তিত রেখে তার আকার পরিবর্তন করতে setScale() ব্যবহার করুন।

// Double the size of the entity
entity.setScale(2f)

সত্তাগুলিতে সাধারণ আচরণ যোগ করুন

এনটিটিগুলোতে সাধারণ আচরণ যোগ করতে আপনি নিম্নলিখিত উপাদানগুলো ব্যবহার করতে পারেন:

  • MovableComponent : ব্যবহারকারীকে সত্তাগুলি সরানোর অনুমতি দেয়
  • ResizableComponent : ব্যবহারকারীকে সামঞ্জস্যপূর্ণ UI প্যাটার্ন মেনে এনটিটিগুলোর আকার পরিবর্তন করার সুযোগ দেয়।
  • InteractableComponent : কাস্টম ইন্টারঅ্যাকশনের জন্য ইনপুট ইভেন্ট ক্যাপচার করতে দেয়।

Session ক্লাসের উপযুক্ত ক্রিয়েশন মেথডের মাধ্যমে কম্পোনেন্ট ইনস্ট্যানশিয়েট করতে হবে। উদাহরণস্বরূপ, একটি ResizableComponent তৈরি করতে, ResizableComponent.create() কল করুন।

কোনো Entity তে নির্দিষ্ট কম্পোনেন্টের আচরণ যোগ করতে addComponent() মেথডটি ব্যবহার করুন।

একটি এনটিটিকে ব্যবহারকারী-সঞ্চালনযোগ্য করতে MovableComponent ব্যবহার করুন।

MovableComponent ব্যবহারকারীকে একটি Entity স্থানান্তর করার সুযোগ দেয়।

ডেকোরেশনগুলোর সাথে ইন্টারঅ্যাক্ট করা হলে কম্পোনেন্টটিতে মুভমেন্ট ইভেন্ট পাঠানো হয়। MovableComponent.createSystemMovable() দিয়ে তৈরি ডিফল্ট সিস্টেম বিহেভিয়ার অনুযায়ী, ডেকোরেশনগুলো ড্র্যাগ করা হলে আপনার Entity স্থানান্তরিত হয়:

val movableComponent = MovableComponent.createSystemMovable(session)
entity.addComponent(movableComponent)

ঐচ্ছিক scaleInZ প্যারামিটারটি (যা ডিফল্টরূপে true সেট করা থাকে), ব্যবহারকারীর থেকে দূরে সরানো হলে এনটিটির স্কেল স্বয়ংক্রিয়ভাবে সামঞ্জস্য করে, ঠিক যেমনভাবে হোম স্পেসে সিস্টেম প্যানেলগুলোকে স্কেল করে। এনটিটি কম্পোনেন্ট সিস্টেমের "ক্যাসকেডিং" প্রকৃতির কারণে, প্যারেন্টের স্কেল তার সমস্ত চাইল্ডকে প্রভাবিত করবে।

আপনি আরও নির্দিষ্ট করতে পারেন যে সত্তাটিকে অনুভূমিক বা উল্লম্ব পৃষ্ঠের মতো কোনো নির্দিষ্ট পৃষ্ঠতলে, অথবা টেবিল, দেয়াল বা ছাদের মতো বিশেষ অর্থগত পৃষ্ঠতলে নোঙর করা যাবে কিনা। নোঙরের বিকল্পগুলি নির্দিষ্ট করতে, MovableComponent তৈরি করার সময় AnchorPlacement এর একটি সেট নির্দিষ্ট করুন। এই উদাহরণে, সত্তাটিকে যেকোনো মেঝে বা টেবিলের অনুভূমিক পৃষ্ঠতলে সরানো এবং নোঙর করা যেতে পারে:

val anchorPlacement = AnchorPlacement.createForPlanes(
    anchorablePlaneOrientations = setOf(PlaneOrientation.VERTICAL),
    anchorablePlaneSemanticTypes = setOf(PlaneSemanticType.FLOOR, PlaneSemanticType.TABLE)
)

val movableComponent = MovableComponent.createAnchorable(
    session = session,
    anchorPlacement = setOf(anchorPlacement)
)
entity.addComponent(movableComponent)

একটি এনটিটিকে ব্যবহারকারীর আকার পরিবর্তনযোগ্য করতে ResizableComponent ব্যবহার করুন।

ResizableComponent ব্যবহারকারীদের একটি Entity আকার পরিবর্তন করার সুযোগ দেয়। ResizableComponent এ ভিজ্যুয়াল ইন্টারঅ্যাকশন সংকেত অন্তর্ভুক্ত থাকে যা ব্যবহারকারীকে Entity এর আকার পরিবর্তন করতে উৎসাহিত করে। ResizableComponent তৈরি করার সময়, আপনি একটি সর্বনিম্ন বা সর্বোচ্চ আকার (মিটারে) নির্দিষ্ট করতে পারেন। আকার পরিবর্তন করার সময় একটি নির্দিষ্ট অ্যাসপেক্ট রেশিও নির্ধারণ করার বিকল্পও আপনার কাছে রয়েছে, যাতে প্রস্থ এবং উচ্চতা একে অপরের সাথে সমানুপাতিকভাবে পরিবর্তিত হয়।

একটি ResizableComponent তৈরি করার সময়, একটি resizeEventListener নির্দিষ্ট করুন যা আপডেট ইভেন্টগুলি পরিচালনা করে। আপনি বিভিন্ন ResizeState ইভেন্টে সাড়া দিতে পারেন, যেমন RESIZE_STATE_ONGOING বা RESIZE_STATE_END

একটি SurfaceEntity তে নির্দিষ্ট অ্যাসপেক্ট রেশিও সহ ResizableComponent ব্যবহারের একটি উদাহরণ এখানে দেওয়া হলো:

val resizableComponent = ResizableComponent.create(session) { event ->
    if (event.resizeState == ResizeEvent.ResizeState.END) {
        // update the Entity to reflect the new size
        surfaceEntity.shape = SurfaceEntity.Shape.Quad(FloatSize2d(event.newSize.width, event.newSize.height))
    }
}
resizableComponent.minimumEntitySize = FloatSize3d(177f, 100f, 1f)
resizableComponent.isFixedAspectRatioEnabled = true // Maintain a fixed aspect ratio when resizing

surfaceEntity.addComponent(resizableComponent)

ব্যবহারকারীর ইনপুট ইভেন্টগুলি ক্যাপচার করতে InteractableComponent ব্যবহার করুন

InteractableComponent আপনাকে ব্যবহারকারীর কাছ থেকে ইনপুট ইভেন্ট গ্রহণ করতে দেয়, যেমন যখন ব্যবহারকারী কোনো Entity এনগেজ করে বা তার উপর হোভার করে। একটি InteractableComponent তৈরি করার সময়, এমন একটি লিসেনার নির্দিষ্ট করুন যা ইনপুট ইভেন্টগুলো গ্রহণ করবে। যখন ব্যবহারকারী কোনো ইনপুট অ্যাকশন সম্পাদন করে, তখন InputEvent প্যারামিটারে দেওয়া ইনপুট তথ্যসহ লিসেনারটি কল করা হবে।

সমস্ত InputEvent কনস্ট্যান্টের সম্পূর্ণ তালিকার জন্য, রেফারেন্স ডকুমেন্টেশন দেখুন।

নিম্নলিখিত কোড স্নিপেটটিতে একটি InteractableComponent ব্যবহার করে কোনো এনটিটির ডান হাত দিয়ে আকার বাড়ানো এবং বাম হাত দিয়ে আকার কমানোর একটি উদাহরণ দেখানো হয়েছে।

val executor = Executors.newSingleThreadExecutor()
val interactableComponent = InteractableComponent.create(session, executor) {
    // when the user disengages with the entity with their hands
    if (it.source == InputEvent.Source.HANDS && it.action == InputEvent.Action.UP) {
        // increase size with right hand and decrease with left
        if (it.pointerType == InputEvent.Pointer.RIGHT) {
            entity.setScale(1.5f)
        } else if (it.pointerType == InputEvent.Pointer.LEFT) {
            entity.setScale(0.5f)
        }
    }
}
entity.addComponent(interactableComponent)

রানটাইমে কাস্টম 3D মডেল তৈরি করুন

কাস্টম মেশ এপিআই আপনাকে glTF ফাইলের মতো স্ট্যাটিক অ্যাসেট লোড করার পরিবর্তে সরাসরি আপনার কোডে প্রোগ্রাম্যাটিকভাবে 3D আকার তৈরি করতে দেয়। তাৎক্ষণিকভাবে কাস্টম জ্যামিতি তৈরি করার মাধ্যমে, আপনি প্রসিডিউরাল ডেটা, ডাইনামিক কাস্টম আকার এবং আপাতদৃষ্টিতে অসীম 3D পরিবেশ, যেমন ভূখণ্ড, রেন্ডার করতে পারেন, যা আপনার ব্যবহারকারীরা অন্বেষণ করার সাথে সাথে ক্রমাগত তৈরি হতে থাকে। এছাড়াও, রানটাইমে মেশ তৈরি করা একটিমাত্র 3D অ্যাসেটের অগণিত সংস্করণ প্যাকেজ করার প্রয়োজনীয়তা দূর করে বাইনারি ফাইলের আকার ছোট করতে সাহায্য করে।