เพิ่มพื้นที่ย่อยที่ติดตามเป้าหมาย

อุปกรณ์ XR ที่รองรับ
คำแนะนำนี้จะช่วยคุณสร้างประสบการณ์การใช้งานสำหรับอุปกรณ์ XR ประเภทนี้
ชุดหูฟัง XR
แว่นตา XR แบบใช้สาย

แม้ว่า 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) ให้จัดการปริมาณเลย์เอาต์อย่างชัดเจนโดยใช้วิธีการต่อไปนี้

  1. ใช้ออฟเซ็ต: ใช้ SubspaceModifier.offset เพื่อดัน UI อุปกรณ์ต่อพ่วง (เช่น HUD) ให้เข้าใกล้หรือไกลออกไปบนแกน Z หรือเลื่อนไปที่ขอบของมุมมองของผู้ใช้
  2. จำกัดขนาด: ใช้ตัวปรับแต่ง เช่น requiredSizeIn เพื่อจำกัดกรอบล้อมรอบของพื้นที่ทำงาน

ดูข้อมูลเพิ่มเติมเกี่ยวกับพื้นที่พิกัด ข้อจำกัดของเลย์เอาต์ และการกำหนดค่าการติดตามที่ใช้ได้ทั้งหมดได้ในเอกสารอ้างอิง Subspace