Jetpack XR SDK আপনাকে Jetpack SceneCore ব্যবহার করে 3D মডেল , স্টেরিওস্কোপিক ভিডিও এবং PanelEntity এর মতো Entity ইনস্ট্যান্স তৈরি, নিয়ন্ত্রণ এবং পরিচালনা করতে দেয়।
জেটপ্যাক সিনকোর 3D ডেভেলপমেন্টকে সমর্থন করার জন্য দুটি সাধারণ স্থাপত্য নিদর্শন গ্রহণ করে: একটি দৃশ্য গ্রাফ এবং একটি সত্তা-উপাদান সিস্টেম (ECS)।
সত্তা তৈরি এবং নিয়ন্ত্রণ করতে দৃশ্য গ্রাফ ব্যবহার করুন
3D স্পেসে অবজেক্ট তৈরি এবং নিয়ন্ত্রণ করতে, আপনি দৃশ্য গ্রাফে অ্যাক্সেস পেতে Jetpack SceneCore এর Session API ব্যবহার করতে পারেন। দৃশ্য গ্রাফটি ব্যবহারকারীর বাস্তব জগতের সাথে সামঞ্জস্যপূর্ণ এবং আপনাকে প্যানেল এবং 3D মডেলের মতো 3D সত্তাগুলিকে একটি শ্রেণিবদ্ধ কাঠামোতে সংগঠিত করতে এবং সেই সত্তাগুলির অবস্থা ধরে রাখতে দেয়।
একবার আপনি দৃশ্য গ্রাফে অ্যাক্সেস পেয়ে গেলে, আপনি দৃশ্য গ্রাফের মধ্যে স্থানিক UI (উদাহরণস্বরূপ, SpatialPanel এবং Orbiter ইনস্ট্যান্স) তৈরি করতে Jetpack Compose for XR-এর API গুলি ব্যবহার করতে পারেন। 3D মডেলের মতো 3D কন্টেন্টের জন্য, আপনি সরাসরি সেশন অ্যাক্সেস করতে পারেন। আরও জানতে, এই পৃষ্ঠায় ActivitySpace সম্পর্কে দেখুন।
সত্তা উপাদান সিস্টেম
একটি সত্তা উপাদান সিস্টেম উত্তরাধিকারের উপর গঠনের নীতি অনুসরণ করে। আপনি আচরণ-সংজ্ঞায়িত উপাদান সংযুক্ত করে সত্তার আচরণ প্রসারিত করতে পারেন, যা আপনাকে বিভিন্ন ধরণের সত্তার ক্ষেত্রে একই আচরণ প্রয়োগ করতে দেয়। আরও তথ্যের জন্য, এই পৃষ্ঠায় সত্তাগুলিতে সাধারণ আচরণ যোগ করুন দেখুন।
অ্যাক্টিভিটিস্পেস সম্পর্কে
প্রতিটি Session একটি ActivitySpace থাকে যা Session দিয়ে স্বয়ংক্রিয়ভাবে তৈরি হয়। ActivitySpace হল দৃশ্য গ্রাফের শীর্ষ-স্তরের Entity ।
ActivitySpace একটি ত্রিমাত্রিক স্থান প্রতিনিধিত্ব করে যেখানে একটি ডান-হাতের স্থানাঙ্ক ব্যবস্থা রয়েছে (x-অক্ষ ডানদিকে নির্দেশ করে, y-অক্ষ উপরে নির্দেশ করে এবং z-অক্ষটি মূলের সাপেক্ষে পিছনে থাকে) এবং বাস্তব জগতের সাথে মেলে এমন ইউনিটগুলির জন্য মিটার রয়েছে। ActivitySpace এর উৎপত্তি কিছুটা স্বেচ্ছাচারী (কারণ ব্যবহারকারীরা বাস্তব জগতের মধ্যে ActivitySpace এর অবস্থান পুনরায় সেট করতে পারেন), তাই উৎপত্তির সাপেক্ষে বিষয়বস্তু একে অপরের সাপেক্ষে স্থাপন করার পরামর্শ দেওয়া হয়।
সত্তার সাথে কাজ করুন
সিনকোরের কেন্দ্রবিন্দুতে রয়েছে সত্তা। ব্যবহারকারী যা দেখেন এবং যার সাথে ইন্টারঅ্যাক্ট করেন তার বেশিরভাগই প্যানেল, 3D মডেল এবং আরও অনেক কিছুর প্রতিনিধিত্বকারী সত্তা।
যেহেতু ActivitySpace হল দৃশ্য গ্রাফের শীর্ষ-স্তরের নোড, ডিফল্টরূপে, সমস্ত নতুন সত্তা সরাসরি ActivitySpace এ স্থাপন করা হয়। আপনি দৃশ্য গ্রাফের সাথে তার parent সেট করে অথবা addChild() ব্যবহার করে সত্তাগুলিকে স্থানান্তর করতে পারেন।
সত্তার কিছু ডিফল্ট আচরণ থাকে যা সকল সত্তার জন্য সর্বজনীন, যেমন অবস্থান পরিবর্তন, ঘূর্ণন, বা দৃশ্যমানতা। নির্দিষ্ট Entity উপশ্রেণী, যেমন GltfModelEntity , এর অতিরিক্ত আচরণ থাকে যা উপশ্রেণীকে সমর্থন করে।
সত্তাগুলিকে কাজে লাগান
যখন আপনি বেস Entity ক্লাসের অন্তর্গত একটি Entity প্রোপার্টিতে পরিবর্তন করেন, তখন পরিবর্তনটি তার সমস্ত সন্তানদের উপর ক্যাসকেড হবে। উদাহরণস্বরূপ, একটি প্যারেন্ট Entity এর Pose সামঞ্জস্য করার ফলে তার সমস্ত সন্তানদের একই সমন্বয় হবে। একটি চাইল্ড Entity তে পরিবর্তন করলে তার পিতামাতার উপর কোন প্রভাব পড়বে না।
একটি Pose 3D স্পেসের মধ্যে সত্তার অবস্থান এবং ঘূর্ণনকে প্রতিনিধিত্ব করে। অবস্থানটি হল একটি 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 ক্লাসে উপযুক্ত creation পদ্ধতির মাধ্যমে কম্পোনেন্ট ইন্সট্যান্টিয়েটিং করতে হবে। উদাহরণস্বরূপ, একটি ResizableComponent তৈরি করতে, ResizableComponent.create() কল করুন।
একটি Entity তে নির্দিষ্ট কম্পোনেন্ট আচরণ যোগ করতে addComponent() পদ্ধতি ব্যবহার করুন।
একটি সত্তাকে ব্যবহারকারী-চলমান করতে MovableComponent ব্যবহার করুন
MovableComponent ব্যবহারকারীর দ্বারা একটি Entity স্থানান্তরযোগ্য করার অনুমতি দেয়।
যখন ডেকোরেশনের সাথে ইন্টারঅ্যাক্ট করা হয় তখন মুভমেন্ট ইভেন্টগুলি কম্পোনেন্টে প্রেরণ করা হয়। ডিফল্ট সিস্টেম আচরণ, যা MovableComponent.createSystemMovable() দিয়ে তৈরি, আপনার Entity যখন ডেকোরেশন টেনে আনা হয় তখন মুভমেন্ট করে:
val movableComponent = MovableComponent.createSystemMovable(session) entity.addComponent(movableComponent)
ঐচ্ছিক scaleInZ প্যারামিটার (ডিফল্টরূপে, true তে সেট করা), ব্যবহারকারীর কাছ থেকে দূরে সরানোর সাথে সাথে Entity স্বয়ংক্রিয়ভাবে তার স্কেল সামঞ্জস্য করে, ঠিক যেমনটি হোম স্পেসে সিস্টেম দ্বারা প্যানেলগুলি স্কেল করা হয়। Entity কম্পোনেন্ট সিস্টেমের "ক্যাসকেডিং" প্রকৃতির কারণে, পিতামাতার স্কেল তার সমস্ত সন্তানদের উপর প্রভাব ফেলবে।
আপনি এন্টিটিকে অনুভূমিক বা উল্লম্ব পৃষ্ঠের মতো কোনও পৃষ্ঠের সাথে নোঙর করা যেতে পারে কিনা, অথবা টেবিল, দেয়াল বা সিলিংয়ের মতো নির্দিষ্ট শব্দার্থিক পৃষ্ঠের সাথে নোঙর করা যেতে পারে কিনা তাও নির্দিষ্ট করতে পারেন। অ্যাঙ্কর বিকল্পগুলি নির্দিষ্ট করতে, 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.actionইনপুটের ধরণ নির্দিষ্ট করে, যেমন কোনও সত্তার উপর ঘোরানো বা ট্যাপ করা -
InputEvent.sourceনির্দিষ্ট করে যে ইনপুটটি কোথা থেকে এসেছে যেমন হাত বা নিয়ামক ইনপুট -
InputEvent.pointerTypeনির্দিষ্ট করে যে ইনপুটটি ডান হাত থেকে এসেছে নাকি বাম হাত থেকে এসেছে
সমস্ত 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)