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

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 modelPosition = 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 তৈরি করতে, session.createResizableComponent() কে কল করুন।

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

একটি সত্তা ব্যবহারকারী-অস্থাবর করতে Movable Component ব্যবহার করুন

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

এখানে এমন একটি সত্তার উদাহরণ দেওয়া হল যা যেকোন উল্লম্ব পৃষ্ঠে এবং শুধুমাত্র মেঝে এবং ছাদের অনুভূমিক পৃষ্ঠগুলিতে সরানো এবং নোঙ্গর করা যেতে পারে।

val anchorPlacement = AnchorPlacement.createForPlanes(
    planeTypeFilter = setOf(PlaneSemantic.FLOOR, PlaneSemantic.TABLE),
    planeSemanticFilter = setOf(PlaneType.VERTICAL))

val movableComponent = xrSession.createMovableComponent(
    systemMovable = false,
    scaleInZ = false,
    anchorPlacement = setOf(anchorPlacement)
)
entity.addComponent(movableComponent)

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

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

এখানে একটি নির্দিষ্ট আকৃতির অনুপাত সহ ResizableComponent ব্যবহার করার একটি উদাহরণ রয়েছে:

val resizableComponent = xrSession.createResizableComponent()
resizableComponent.minimumSize = Dimensions(177f, 100f, 1f )
resizableComponent.fixedAspectRatio = 16f / 9f //Specify a 16:9 aspect ratio
entity.addComponent(resizableComponent)

ব্যবহারকারীর ইনপুট ইভেন্ট ক্যাপচার করতে Interactable Component ব্যবহার করুন

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

  • InputEvent.action ইনপুটের প্রকার নির্দিষ্ট করে যেমন একটি সত্তার উপর ঘোরানো বা ট্যাপ করা(ACTION_DOWN)
  • InputEvent.source নির্দিষ্ট করে কোথা থেকে ইনপুট এসেছে যেমন হাত বা কন্ট্রোলার ইনপুট
  • InputEvent.pointerType ইনপুট ডান হাত বা বাম হাত থেকে এসেছে তা নির্দিষ্ট করে

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

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

private val executor by lazy { Executors.newSingleThreadExecutor() }
val interactableComponent = xrSession.createInteractableComponent(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)