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

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 ধ্রুবকের সম্পূর্ণ তালিকার জন্য, রেফারেন্স ডকুমেন্টেশন দেখুন।

নিম্নলিখিত কোড স্নিপেটটি ডান হাত দিয়ে একটি সত্তার আকার বাড়াতে এবং বাম হাতে হ্রাস করতে একটি 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)