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
এ স্থাপন করা হয়। আপনি setParent
বা addChild
কল করে দৃশ্য গ্রাফ বরাবর সত্তা স্থানান্তর করতে পারেন।
সত্তার এমন কিছু ডিফল্ট আচরণ আছে যা সমস্ত সত্তার জন্য সার্বজনীন, যেমন অবস্থান পরিবর্তন, ঘূর্ণন বা দৃশ্যমানতা। GltfEntity
মতো নির্দিষ্ট 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
দৃশ্যমানতা পরিবর্তন করতে, setHidden
ব্যবহার করুন।
// Hide the entity entity.setHidden(true)
একটি Entity
সামগ্রিক আকৃতি বজায় রেখে আকার পরিবর্তন করতে, setScale
ব্যবহার করুন।
// Double the size of the entity entity.setScale(2f)
সত্তাগুলিতে সাধারণ আচরণ যুক্ত করুন
সত্তাগুলিতে সাধারণ আচরণ যোগ করতে আপনি নিম্নলিখিত উপাদানগুলি ব্যবহার করতে পারেন:
-
MovableComponent
: ব্যবহারকারীকে সত্তা সরানোর অনুমতি দেয় -
ResizableComponent
: ব্যবহারকারীকে সামঞ্জস্যপূর্ণ UI প্যাটার্ন সহ সত্তার আকার পরিবর্তন করার অনুমতি দেয় -
InteractableComponent
: আপনাকে কাস্টম ইন্টারঅ্যাকশনের জন্য ইনপুট ইভেন্ট ক্যাপচার করতে দেয়
Session
ক্লাসে উপযুক্ত সৃষ্টি পদ্ধতির মাধ্যমে ইনস্ট্যান্টিয়েটিং উপাদানগুলি অবশ্যই করা উচিত। উদাহরণস্বরূপ, একটি ResizableComponent
তৈরি করতে, ResizableComponent.create()
কল করুন।
একটি Entity
নির্দিষ্ট উপাদান আচরণ যোগ করতে addComponent()
পদ্ধতি ব্যবহার করুন।
একটি সত্তা ব্যবহারকারী-অস্থাবর করতে Movable Component ব্যবহার করুন
MovableComponent
একটি Entity
ব্যবহারকারীর দ্বারা অস্থাবর হতে দেয়। আপনি এটিও নির্দিষ্ট করতে পারেন যে সত্তাটি অনুভূমিক বা উল্লম্ব পৃষ্ঠের মতো পৃষ্ঠের প্রকারে বা টেবিল, প্রাচীর বা ছাদের মতো নির্দিষ্ট শব্দার্থিক পৃষ্ঠগুলিতে নোঙ্গর করা যেতে পারে। অ্যাঙ্কর বিকল্পগুলি নির্দিষ্ট করতে, MovableComponent
তৈরি করার সময় AnchorPlacement
এর একটি সেট নির্দিষ্ট করুন।
এখানে এমন একটি সত্তার উদাহরণ দেওয়া হল যা যেকোন উল্লম্ব পৃষ্ঠে এবং শুধুমাত্র মেঝে এবং ছাদের অনুভূমিক পৃষ্ঠগুলিতে সরানো এবং নোঙ্গর করা যেতে পারে।
val anchorPlacement = AnchorPlacement.createForPlanes( planeTypeFilter = setOf(PlaneSemantic.FLOOR, PlaneSemantic.TABLE), planeSemanticFilter = setOf(PlaneType.VERTICAL) ) val movableComponent = MovableComponent.create( session = session, systemMovable = false, scaleInZ = false, anchorPlacement = setOf(anchorPlacement) ) entity.addComponent(movableComponent)
ব্যবহারকারী সত্তাকে সরানোর সাথে সাথে, scaleInZ
প্যারামিটার স্বয়ংক্রিয়ভাবে তার সত্তার স্কেলকে সামঞ্জস্য করে কারণ এটি ব্যবহারকারীর কাছ থেকে একইভাবে সরে যায় যেভাবে প্যানেলগুলি হোম স্পেসে সিস্টেম দ্বারা স্কেল করা হয়৷ সত্তা উপাদান সিস্টেমের "ক্যাসকেডিং" প্রকৃতির কারণে, পিতামাতার স্কেল তার সমস্ত সন্তানকে প্রভাবিত করবে।
একটি এন্টিটিকে ব্যবহারকারীর আকার পরিবর্তনযোগ্য করতে Resizable Component ব্যবহার করুন
ResizableComponent
Component ব্যবহারকারীদের একটি Entity
আকার পরিবর্তন করতে দেয়। ResizableComponent
Component-এ চাক্ষুষ মিথস্ক্রিয়া সংকেত রয়েছে যা ব্যবহারকারীকে একটি Entity
আকার পরিবর্তন করতে আমন্ত্রণ জানায়। ResizeableComponent
তৈরি করার সময়, আপনি একটি সর্বনিম্ন বা সর্বোচ্চ আকার (মিটারে) নির্দিষ্ট করতে পারেন। আকার পরিবর্তন করার সময় আপনার কাছে একটি নির্দিষ্ট আকৃতির অনুপাত নির্দিষ্ট করার বিকল্প রয়েছে যাতে প্রস্থ এবং উচ্চতা একে অপরের সমানুপাতিকভাবে পুনরায় আকার দেয়।
ResieableComponent
ব্যবহার করার সময়, onResizeUpdate
বা onResizeEnd
মতো নির্দিষ্ট রিসাইজিং ইভেন্টগুলিতে প্রতিক্রিয়া জানাতে আপনাকে অবশ্যই একটি ResizeListener
নির্দিষ্ট করতে হবে।
এখানে একটি SurfaceEntity
এ একটি নির্দিষ্ট আকৃতির অনুপাত সহ ResizableComponent
ব্যবহার করার একটি উদাহরণ রয়েছে:
val resizableComponent = ResizableComponent.create(session) resizableComponent.minimumSize = Dimensions(177f, 100f, 1f) resizableComponent.fixedAspectRatio = 16f / 9f // Specify a 16:9 aspect ratio resizableComponent.addResizeListener( executor, object : ResizeListener { override fun onResizeEnd(entity: Entity, finalSize: Dimensions) { // update the size in the component resizableComponent.size = finalSize // update the Entity to reflect the new size (entity as SurfaceEntity).canvasShape = SurfaceEntity.CanvasShape.Quad(finalSize.width, finalSize.height) } }, ) entity.addComponent(resizableComponent)
ব্যবহারকারীর ইনপুট ইভেন্ট ক্যাপচার করতে Interactable Component ব্যবহার করুন
InteractableComponent
আপনাকে ব্যবহারকারীর কাছ থেকে ইনপুট ইভেন্টগুলি ক্যাপচার করতে দেয়, যেমন ব্যবহারকারী যখন কোনও Entity
উপর নিযুক্ত হন বা হোভার করেন। একটি InteractableComponent
তৈরি করার সময়, ইনপুট ইভেন্টগুলি পেতে আপনাকে অবশ্যই একটি InputEventListener
নির্দিষ্ট করতে হবে। ব্যবহারকারী যখন কোনো ইনপুট ক্রিয়া সম্পাদন করে, তখন InputEvent
প্যারামিটারে প্রদত্ত নির্দিষ্ট ইনপুট তথ্যের সাথে onInputEvent
পদ্ধতি কল করা হবে।
-
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_TYPE_RIGHT) { entity.setScale(1.5f) } else if (it.pointerType == InputEvent.POINTER_TYPE_LEFT) { entity.setScale(0.5f) } } } entity.addComponent(interactableComponent)