ব্যবহারকারী হেড ট্র্যাকিংয়ের অনুমতি দেওয়ার পর, আপনার অ্যাপটি Jetpack XR-এর জন্য ARCore-এর মাধ্যমে হেড পোজের তথ্য পুনরুদ্ধার করতে পারে। হেড পোজের তথ্য আপনার অ্যাপটিকে আরও স্বজ্ঞাত অভিজ্ঞতা তৈরি করতে সাহায্য করতে পারে, যেমন ব্যবহারকারীর ভিউ ফিল্ড অনুসরণ করে একটি উইন্ডো।
Jetpack XR সেশনের জন্য একটি ARCore তৈরি করুন
জেটপ্যাক এক্সআর সেশনের জন্য ARCore এর মাধ্যমে হেড পোজ তথ্য পান। একটি Session
পেতে একটি সেশনের জীবনচক্র বুঝতে দেখুন।
সেশন কনফিগার করুন
XR সেশনে ডিফল্টরূপে হেড ট্র্যাকিং সক্ষম করা থাকে না। হেড ট্র্যাকিং সক্ষম করতে, সেশনটি কনফিগার করুন এবং HeadTrackingMode.LAST_KNOWN
মোড সেট করুন:
val newConfig = session.config.copy( headTracking = Config.HeadTrackingMode.LAST_KNOWN, ) when (val result = session.configure(newConfig)) { is SessionConfigureSuccess -> TODO(/* Success! */) is SessionConfigureConfigurationNotSupported -> TODO(/* Some combinations of configurations are not valid. Handle this failure case. */) else -> TODO(/* The session could not be configured. See SessionConfigureResult for possible causes. */) }
মাথার ভঙ্গির তথ্য পুনরুদ্ধার করুন
হেড পোজ ডেটা একটি RenderViewpoint
মাধ্যমে প্রকাশিত হয়। একটি RenderViewpoint
একটি ডিভাইসের নির্দিষ্ট দৃষ্টিকোণের জন্য পোজ এবং ক্ষেত্র বর্ণনা করে। একটি ডিভাইসের বাম, ডান বা মনো ভিউপয়েন্ট থাকতে পারে, যা ডিভাইসের ক্ষমতার উপর নির্ভর করে।
মনো ভিউপয়েন্টের জন্য ডেটা পেতে:
val mono = RenderViewpoint.mono(session) ?: return mono.state.collect { state -> val fov = state.fieldOfView val viewpointPose = state.pose }
হেড ট্র্যাকিংয়ের অ্যাপ্লিকেশন
আপনার অ্যাপটি হেড ট্র্যাকিং ব্যবহার করতে পারে এমন একটি উপায় হল ব্যবহারকারীর দৃষ্টিভঙ্গির ক্ষেত্রে সত্তা রাখা, যে অ্যাপগুলিতে আপনার ব্যবহারকারীদের দেখতে বা ঘোরাফেরা করতে হয়।
ব্যবহারকারীর ভিউ ফিল্ডে হেডলকড এন্টিটি ব্যবহার করা এড়িয়ে চলুন কারণ এটি মোশন সিকনেস সৃষ্টি করতে পারে। পরিবর্তে, অল্প সময়ের পরে ব্যবহারকারীর মাথা অনুসরণ করে এমন এন্টিটি মুভমেন্ট ব্যবহার করুন:
val viewpointPose = RenderViewpoint.left(session)!!.state lifecycleScope.launch { while (true) { delay(2000) val start = panel.getPose() val startTime = session.state.value.timeMark val pose = session.scene.perceptionSpace.transformPoseTo( viewpointPose.value.pose, session.scene.activitySpace ) val target = Pose(pose.translation + pose.forward * 1f, pose.rotation) while (true) { val ratio = (session.state.value.timeMark - startTime).inWholeMilliseconds / 500f panel.setPose(Pose.lerp(start, target, ratio)) if (ratio > 1f) break } } }