Jetpack XR SDK আপনাকে Jetpack SceneCore ব্যবহার করে Jetpack SceneCore ব্যবহার করে 3D মডেল , স্টেরিওস্কোপিক ভিডিও এবং PanelEntity
এর মতো Entity
উদাহরণ তৈরি, নিয়ন্ত্রণ এবং পরিচালনা করতে দেয়।
জেটপ্যাক সিনকোর 3D বিকাশকে সমর্থন করার জন্য দুটি সাধারণ স্থাপত্য নিদর্শন গ্রহণ করে: একটি দৃশ্য গ্রাফ এবং একটি সত্তা-কম্পোনেন্ট সিস্টেম (ECS)।
সত্তা তৈরি এবং নিয়ন্ত্রণ করতে দৃশ্য গ্রাফ ব্যবহার করুন
3D স্পেসে বস্তু তৈরি এবং নিয়ন্ত্রণ করতে, আপনি দৃশ্য গ্রাফে অ্যাক্সেস পেতে Jetpack SceneCore এর সেশন API ব্যবহার করতে পারেন। দৃশ্য গ্রাফটি ব্যবহারকারীর বাস্তব জগতের সাথে সারিবদ্ধ করে এবং আপনাকে 3D সত্তা যেমন প্যানেল এবং 3D মডেলগুলিকে একটি শ্রেণিবদ্ধ কাঠামোতে সংগঠিত করতে এবং সেই সত্তাগুলির অবস্থা ধরে রাখতে দেয়৷
একবার আপনি দৃশ্য গ্রাফে অ্যাক্সেস পেয়ে গেলে, আপনি দৃশ্য গ্রাফের মধ্যে স্থানিক UI (উদাহরণস্বরূপ, SpatialPanel
এবং Orbiter
দৃষ্টান্ত) তৈরি করতে XR-এর জন্য Jetpack Compose-এর API ব্যবহার করতে পারেন। 3D সামগ্রী যেমন 3D মডেলের জন্য, আপনি সরাসরি সেশন অ্যাক্সেস করতে পারেন। আরও জানতে, এই পৃষ্ঠায় ActivitySpace সম্পর্কে দেখুন।
সত্তা উপাদান সিস্টেম
একটি সত্তা উপাদান সিস্টেম উত্তরাধিকারের উপর রচনার নীতি অনুসরণ করে। আপনি আচরণ-সংজ্ঞায়িত উপাদান সংযুক্ত করে সত্তার আচরণকে প্রসারিত করতে পারেন, যা আপনাকে বিভিন্ন ধরনের সত্তায় একই আচরণ প্রয়োগ করতে দেয়। আরও তথ্যের জন্য, এই পৃষ্ঠায় সত্তাগুলিতে সাধারণ আচরণ যুক্ত করুন দেখুন।
ActivitySpace সম্পর্কে
প্রতিটি Session
একটি ActivitySpace
থাকে যা Session
সাথে স্বয়ংক্রিয়ভাবে তৈরি হয়। ActivitySpace
হল দৃশ্য গ্রাফের শীর্ষ-স্তরের Entity
।
ActivitySpace একটি 3-মাত্রিক স্থানকে প্রতিনিধিত্ব করে একটি ডান-হাতের স্থানাঙ্ক ব্যবস্থা সহ (x-অক্ষটি ডানদিকে পয়েন্ট করে, y-অক্ষটি উপরে এবং z-অক্ষটি মূলের সাথে সম্পর্কিত) এবং বাস্তব জগতের সাথে মেলে এমন ইউনিটগুলির জন্য মিটার সহ। ActivitySpace
এর উৎপত্তি কিছুটা স্বেচ্ছাচারী (যেহেতু ব্যবহারকারীরা বাস্তব জগতের মধ্যে ActivitySpace
এর অবস্থান পুনরায় সেট করতে পারেন), তাই উত্সের সাথে সম্পর্কিত না হয়ে একে অপরের সাথে সম্পর্কিত বিষয়বস্তুর অবস্থান করার পরামর্শ দেওয়া হয়।
সংস্থার সাথে কাজ করুন
সত্তাগুলি দৃশ্যকরের কেন্দ্রবিন্দু। ব্যবহারকারী যা দেখেন এবং যার সাথে ইন্টারঅ্যাক্ট করেন তা হল প্যানেল, 3D মডেল এবং আরও অনেক কিছুর প্রতিনিধিত্বকারী সত্তা।
যেহেতু ActivitySpace
দৃশ্য গ্রাফের শীর্ষ-স্তরের নোড, ডিফল্টরূপে, সমস্ত নতুন সত্তা সরাসরি ActivitySpace
এ স্থাপন করা হয়। আপনি দৃশ্য গ্রাফ বরাবর সত্তাগুলিকে এর parent
সেট করে বা addChild()
ব্যবহার করে স্থানান্তর করতে পারেন।
সত্তার এমন কিছু ডিফল্ট আচরণ আছে যা সমস্ত সত্তার জন্য সার্বজনীন, যেমন অবস্থান পরিবর্তন, ঘূর্ণন বা দৃশ্যমানতা। GltfModelEntity
মতো নির্দিষ্ট Entity
সাবক্লাসে অতিরিক্ত আচরণ রয়েছে যা সাবক্লাসকে সমর্থন করে।
সত্তা ম্যানিপুলেট
আপনি যখন বেস 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
ক্লাসে উপযুক্ত সৃষ্টি পদ্ধতির মাধ্যমে ইনস্ট্যান্টিয়েটিং উপাদানগুলি অবশ্যই করা উচিত। উদাহরণস্বরূপ, একটি 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
Component ব্যবহারকারীদের একটি Entity
আকার পরিবর্তন করতে দেয়। ResizableComponent
Component-এ চাক্ষুষ মিথস্ক্রিয়া সংকেত রয়েছে যা ব্যবহারকারীকে একটি Entity
আকার পরিবর্তন করতে আমন্ত্রণ জানায়। ResizableComponent
তৈরি করার সময়, আপনি একটি সর্বনিম্ন বা সর্বোচ্চ আকার (মিটারে) নির্দিষ্ট করতে পারেন। আকার পরিবর্তন করার সময় আপনার কাছে একটি নির্দিষ্ট আকৃতির অনুপাত নির্দিষ্ট করার বিকল্প রয়েছে যাতে প্রস্থ এবং উচ্চতা একে অপরের সমানুপাতিকভাবে পুনরায় আকার দেয়।
একটি ResizableComponent
তৈরি করার সময়, একটি resizeEventListener
নির্দিষ্ট করুন যা আপডেট ইভেন্টগুলি পরিচালনা করে। আপনি বিভিন্ন ResizeState
ইভেন্টে প্রতিক্রিয়া জানাতে পারেন, যেমন RESIZE_STATE_ONGOING
বা RESIZE_STATE_END
।
এখানে একটি SurfaceEntity
এ একটি নির্দিষ্ট আকৃতির অনুপাত সহ ResizableComponent
ব্যবহার করার একটি উদাহরণ রয়েছে:
val resizableComponent = ResizableComponent.create(session) { event -> if (event.resizeState == ResizeEvent.ResizeState.RESIZE_STATE_END) { // update the Entity to reflect the new size surfaceEntity.canvasShape = SurfaceEntity.CanvasShape.Quad(event.newSize.width, event.newSize.height) } } resizableComponent.minimumEntitySize = FloatSize3d(177f, 100f, 1f) resizableComponent.fixedAspectRatio = 16f / 9f // Specify a 16:9 aspect ratio 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.SOURCE_HANDS && it.action == InputEvent.Action.ACTION_UP) { // increase size with right hand and decrease with left if (it.pointerType == InputEvent.Pointer.POINTER_TYPE_RIGHT) { entity.setScale(1.5f) } else if (it.pointerType == InputEvent.Pointer.POINTER_TYPE_LEFT) { entity.setScale(0.5f) } } } entity.addComponent(interactableComponent)