แม้ว่า Subspace มาตรฐานจะอยู่ในตำแหน่งคงที่ซึ่งกำหนดโดยระบบ แต่บางครั้งคุณอาจต้องการให้ UI เชิงพื้นที่ของแอปเคลื่อนไหวแบบไดนามิกไปพร้อมกับผู้ใช้ หรือติดอยู่กับตำแหน่งที่เฉพาะเจาะจงในสภาพแวดล้อมหรือในโลกจริง คุณสามารถส่ง FollowTarget ไปยังพารามิเตอร์ follow ของ Subspace เพื่อสร้างประสบการณ์ต่างๆ เช่น HUD ที่ล็อกไว้กับศีรษะหรือแผงข้อมูลที่แนบมากับวัตถุในโลกจริง
เพิ่มพื้นที่ย่อยที่ติดตามมุมมองของผู้ใช้
หากต้องการเพิ่มพื้นที่ย่อยที่จัดตำแหน่งตามขอบเขตการมองเห็นของผู้ใช้ ให้ใช้ FollowTarget.view ขึ้นอยู่กับโหมดติดตามที่คุณระบุ ซึ่งจะช่วยให้คุณติดตามการเคลื่อนไหวของศีรษะของผู้ใช้อย่างต่อเนื่องหรือวางเนื้อหาแบบคงที่ตามตำแหน่งที่ผู้ใช้มองอยู่ได้ คุณสามารถใช้ฟีเจอร์นี้กับสิ่งต่างๆ เช่น HUD, การแจ้งเตือนแบบถาวร หรือการควบคุมการใช้งานแบบลัด
ประกาศและขอสิทธิ์
ก่อนที่จะขอสิทธิ์ คุณต้องประกาศสิทธิ์เหล่านั้นในไฟล์ Manifest ของแอปโดยใช้องค์ประกอบ <uses-permission>
<manifest ...>
<!-- Only declare permissions that your app actually needs. In this example,
we declare permissions for head tracking. -->
<uses-permission android:name="android.permission.HEAD_TRACKING"/>
<application ...>
...
</application>
</manifest>
จากนั้นขอสิทธิ์ ดูข้อมูลเพิ่มเติมได้ที่หลักการและเวิร์กโฟลว์ของสิทธิ์เพื่อให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ดีที่สุด เช่น การตรวจสอบว่าผู้ใช้ได้ให้สิทธิ์รันไทม์ที่แอปต้องการแล้วหรือยัง และแอปควรแสดงเหตุผลแก่ผู้ใช้ก่อนขอสิทธิ์นี้หรือไม่
กำหนดค่าเซสชัน
ถัดไป คุณจะกำหนดค่าเซสชันของแอปที่สร้างขึ้นให้คุณเมื่อใช้ Jetpack Compose สำหรับ XR โดยตั้งค่า DeviceTrackingMode.SPATIAL ดังนี้
val session = checkNotNull(LocalSession.current)
session.configure(
config = Config.Builder(session.config).setDeviceTracking(DeviceTrackingMode.SPATIAL)
.build()
)
สร้างพื้นที่ย่อย
สุดท้าย คุณจะสร้างพื้นที่ย่อยที่กำหนดเป้าหมายมุมมองของผู้ใช้ พร้อมกับโหมดติดตาม ดังนี้
// Example: A subspace that softly follows the user's view (like a HUD)
Subspace(
follow = FollowTarget.view(
// Customizing the soft follow to move slightly faster and tracking all dimensions
mode = FollowMode.soft(
)
),
modifier = modifier,
) {
SpatialPanel {
// SpatialPanel Content
}
}
โหมดติดตามสำหรับพื้นที่ย่อยที่กำหนดเป้าหมายมุมมองของผู้ใช้
เมื่อใช้ FollowTarget.view เป็นเป้าหมาย คุณจะปรับแต่งลักษณะการทำงานของเนื้อหาได้โดยระบุ FollowMode ดังนี้
FollowMode.soft: เนื้อหาจะค่อยๆ ตามการเคลื่อนไหวของเป้าหมายทัน ทำให้เกิดเอฟเฟกต์การลอยที่ราบรื่นFollowMode.snap: เนื้อหาจะแสดงต่อหน้าผู้ใช้ 1 ครั้งตามท่าทางการมองครั้งแรกของผู้ใช้ และจะคงที่หลังจากนั้นFollowMode.tight: เนื้อหาจะติดตามมุมมองของผู้ใช้ทันทีโดยมีความล่าช้าน้อยที่สุด เพื่อให้เนื้อหาเชื่อมโยงกับการเคลื่อนไหวของผู้ใช้อย่างใกล้ชิด
โหมดติดตามทั้งหมดช่วยให้คุณเลือกมิติข้อมูลการเคลื่อนไหวที่ระบบจะติดตามได้จากตัวเลือกต่อไปนี้
- แกน X
- แกน Y
- เสนอเพลง
- ม้วนกระดาษ
- การหันเห
RotationOnly: ช่วยให้คุณระบุค่าเดียวเพื่อติดตามมิติข้อมูลที่เกี่ยวข้องกับการหมุน (การหมุนรอบแกนขวาง การหมุนรอบแกนตั้ง และการหมุนรอบแกนตามยาว)
คุณสามารถเลือกมิติข้อมูลเหล่านี้ร่วมกันได้ทุกแบบ หรือใช้ค่าเริ่มต้นของ TrackedDimensions.All ที่ติดตามมิติข้อมูลทั้งหมด
เพิ่มพื้นที่ย่อยที่สอดคล้องกับลักษณะของสภาพแวดล้อม
หากต้องการเพิ่มพื้นที่ย่อยที่ล็อกเนื้อหาเชิงพื้นที่ให้ตรงกับลักษณะทางกายภาพในสภาพแวดล้อมของผู้ใช้อย่างเคร่งครัด ให้ใช้ FollowTarget.anchor() ใช้เป้าหมายประเภทนี้เพื่อติดตามระนาบที่ตรวจพบ Anchor หรือตำแหน่งเชิงพื้นที่
การติดตามฟีเจอร์ในโลกจริงต้องใช้สิทธิ์และการกำหนดค่าเซสชันเพิ่มเติม ทั้งนี้ขึ้นอยู่กับฟีเจอร์ที่คุณติดตาม
ดูวิธีการโดยละเอียดเกี่ยวกับการทำงานกับความสามารถในการรับรู้สำหรับฟีเจอร์ ARCore รวมถึงการตั้งค่าสิทธิ์ที่จำเป็นและการกำหนดค่าเซสชันเพื่อใช้ FollowTarget.anchor() ได้ที่เอกสารประกอบของ Jetpack XR SDK สำหรับระนาบ Anchor และท่าทางภูมิสารสนเทศ
ตัวอย่างต่อไปนี้จะสร้างพื้นที่ย่อยที่ติดตาม Anchor ในชีวิตจริง
// A subspace locked to a real-world anchor
Subspace(
follow = FollowTarget.anchor(anchor = myAnchor)
) {
// Rotate the panel to ensure it faces the user while remaining anchored
SpatialPanel(SubspaceModifier.rotateToLookAtUser()) {
// SpatialPanel Content
}
}
หลีกเลี่ยงการทับซ้อนกันของพื้นที่
Subspace แต่ละรายการที่คุณสร้างจะจัดการฉาก 3 มิติของตัวเองอย่างอิสระและไม่รับรู้ถึงพื้นที่ย่อยอื่นๆ ที่มีอยู่ จึงไม่หลีกเลี่ยงการชนกันโดยอัตโนมัติ
หากต้องการป้องกันไม่ให้ HUD ที่ล็อกไว้กับศีรษะตัดผ่านแผง POI ที่ยึดไว้ (Z-fighting) ให้จัดการปริมาณเลย์เอาต์อย่างชัดเจนโดยใช้วิธีการต่อไปนี้
- ใช้ออฟเซ็ต: ใช้
SubspaceModifier.offsetเพื่อดัน UI อุปกรณ์ต่อพ่วง (เช่น HUD) ให้เข้าใกล้หรือไกลออกไปบนแกน Z หรือเลื่อนไปที่ขอบของมุมมองของผู้ใช้ - จำกัดขนาด: ใช้ตัวปรับแต่ง เช่น
requiredSizeInเพื่อจำกัดกรอบล้อมรอบของพื้นที่ทำงาน
ดูข้อมูลเพิ่มเติมเกี่ยวกับพื้นที่พิกัด ข้อจำกัดของเลย์เอาต์ และการกำหนดค่าการติดตามที่ใช้ได้ทั้งหมดได้ในเอกสารอ้างอิง Subspace