เพิ่มสภาพแวดล้อมเชิงพื้นที่ลงในแอป

ใน Jetpack XR SDK สภาพแวดล้อมเชิงพื้นที่คือสภาพแวดล้อมที่สมจริงซึ่งคุณเพิ่มลงในแอปเพื่อปรับแต่งพื้นหลังของฉากเสมือนได้ สภาพแวดล้อมเชิงพื้นที่จะปรากฏขึ้นเมื่อแอปอยู่ในโหมดเต็มพื้นที่เท่านั้น

ภาพรวมของสภาพแวดล้อมเชิงพื้นที่

SpatialEnvironment ใช้เพื่อจัดการค่ากําหนดสภาพแวดล้อมเชิงพื้นที่ของแอป โดยประกอบด้วยรูปภาพสกายบ็อกซ์แบบสแตนด์อโลนและเรขาคณิตที่ระบุโดย glTF คุณจะตั้งค่าได้เพียงรูปภาพสกายบ็อกซ์ 1 รูปและไฟล์เรขาคณิต glTF 1 ไฟล์เท่านั้น

พื้นหลังเสมือนจริงแสดงภาพรอบตัวที่ผู้ใช้เห็นในฉากเสมือนจริง ซึ่งสร้างภาพลวงตาของสภาพแวดล้อมเบื้องหลังที่ไกลออกไป เช่น ท้องฟ้า ภูเขา หรือภาพเมือง ผู้ใช้ไม่สามารถโต้ตอบหรือเข้าใกล้ฉากหลังได้ Jetpack XR SDK รองรับพื้นหลังท้องฟ้าทรงกลมในมาตรฐาน OpenEXR นอกจากจะให้พื้นหลังที่สมจริงสำหรับแอปแล้ว พื้นหลังฟ้า EXR ยังให้แสงตามภาพ (IBL) แก่โมเดล 3 มิติที่แอปโหลดอีกด้วย ดูข้อมูลเพิ่มเติมได้ที่คู่มือสำหรับการทำงานกับโมเดล 3 มิติ

สภาพแวดล้อมเชิงพื้นที่ยังอาจมีเนื้อหาเรขาคณิต 3 มิติในมาตรฐาน glTF ด้วย เรขาคณิตของสภาพแวดล้อมที่โหลดด้วยวิธีนี้จะจัดแนวให้สอดคล้องกับพื้นจริงโดยอัตโนมัติ เรขาคณิตของสภาพแวดล้อมเป็นวิธีที่ยอดเยี่ยมในการเพิ่มความสมจริงให้กับสภาพแวดล้อมผ่านองค์ประกอบของพื้นหน้าและพื้นหลังที่ผสานเข้ากับพื้นหลังด้วยเอฟเฟกต์ภาพพาโนรามา

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

คุณสามารถตั้งค่าสภาพแวดล้อมเชิงพื้นที่ของแอปเป็นการกำหนดค่าอย่างใดอย่างหนึ่งต่อไปนี้

  • การรวมรูปภาพพื้นหลังและเรขาคณิต glTF
  • พื้นผิวที่แสดงภาพผ่าน ซึ่งสภาพแวดล้อมที่แสดงคือฟีดสดจากกล้องที่หันออกของอุปกรณ์ เมื่อมีความทึบแสงเต็มที่ พื้นผิวนี้บดบังพื้นหลังและเรขาคณิตโดยสมบูรณ์
  • การกําหนดค่าแบบผสม ซึ่งพื้นผิวที่แสดงผลผ่านไม่ได้มีความทึบแสงเต็ม และไม่มีความทึบแสงเป็น 0 ในกรณีนี้ พื้นผิวที่ส่งผ่านจะกลายเป็นแบบโปร่งแสงบางส่วนและอัลฟ่าจะผสมผสานกับพื้นหลังท้องฟ้าและรูปทรงเรขาคณิตที่อยู่เบื้องหลัง

ความสามารถของพื้นที่สำหรับสภาพแวดล้อมเชิงพื้นที่

  • SpatialCapabilities: แสดงถึงความสามารถเชิงพื้นที่ของเซสชันปัจจุบัน ความสามารถบางอย่างของพื้นที่ทำงานมีความเกี่ยวข้องกับสภาพแวดล้อมเชิงพื้นที่

  • SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL: ระบุว่ากิจกรรมเปิดหรือปิดใช้การส่งต่อได้หรือไม่ ณ เวลาปัจจุบัน

  • SPATIAL_CAPABILITY_APP_ENVIRONMENT:บ่งบอกว่ากิจกรรมสามารถตั้งค่าสภาพแวดล้อมเชิงพื้นที่ของตนเองได้หรือไม่ ณ เวลาปัจจุบัน

นําเข้าและโหลดทรัพยากรสภาพแวดล้อมเชิงพื้นที่

ระบบจะโหลดทรัพยากร glTF และ EXR สําหรับสภาพแวดล้อมเชิงพื้นที่แบบไม่พร้อมกันในคลาส Session ไฟล์เหล่านี้ต้องจัดเก็บไว้ในโฟลเดอร์เนื้อหา

สร้างทรัพยากร glTF

ทรัพยากร glTF สามารถสร้างเป็น GltfModel ซึ่งระบบจะโหลด glTF จากไฟล์ในเครื่อง GltfModel สามารถใช้เป็นส่วนหนึ่งของสภาพแวดล้อมแอปเชิงพื้นที่ได้

val environmentGeometryFuture = GltfModel.create(session, "DayGeometry.glb")
val environmentGeometry = environmentGeometryFuture.await()

สร้างทรัพยากรรูปภาพ EXR

ทรัพยากรรูปภาพ EXR สามารถสร้างเป็น ExrImage ซึ่งจะโหลด EXR จากไฟล์ในเครื่อง คุณใช้ ExrImage เป็นส่วนหนึ่งของสภาพแวดล้อมแอปเชิงพื้นที่เพื่อวาดภาพพื้นหลังได้

val skybox = ExrImage.create(session, "BlueSkybox.exr")

ตั้งค่า SpatialEnvironmentPreference สําหรับแอป

setSpatialEnvironmentPreference ใช้เพื่อตั้งค่าสภาพแวดล้อมเชิงพื้นที่ที่ต้องการสําหรับแอป วิธีนี้จะตั้งค่าเฉพาะค่ากําหนดเท่านั้นและจะไม่ทําให้เกิดการเปลี่ยนแปลงในทันที เว้นแต่ว่า isSpatialEnvironmentPreferenceActive จะจริงอยู่แล้ว เมื่ออุปกรณ์เข้าสู่สถานะที่เปลี่ยนพื้นหลัง XR ได้และSpatialCapabilities.SPATIAL_CAPABILITY_APP_ENVIRONMENT ใช้งานได้ สภาพแวดล้อมเชิงพื้นที่ที่ต้องการสำหรับแอปพลิเคชันจะแสดงขึ้นโดยอัตโนมัติ

การตั้งค่าเป็นค่าว่างจะปิดใช้สภาพแวดล้อมเชิงพื้นที่ที่ต้องการสำหรับแอป ซึ่งหมายความว่าระบบจะแสดงสภาพแวดล้อมเริ่มต้นแทน

หาก SpatialEnvironmentPreference ที่ระบุไม่ใช่ค่าว่าง แต่พร็อพเพอร์ตี้ทั้งหมดเป็นค่าว่าง สภาพแวดล้อมเชิงพื้นที่จะประกอบด้วยท้องฟ้าจำลองสีดําและไม่มีเรขาคณิต

หากต้องการรับการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงสถานะของ SpatialEnvironment ให้ใช้ addOnSpatialEnvironmentChangedListener

การใช้งานพื้นฐาน

ข้อมูลโค้ดนี้จะสร้างเรขาคณิตของสภาพแวดล้อมและทรัพยากรสกายบ็อกซ์ จากนั้นจึงตั้งค่าค่ากําหนดของสภาพแวดล้อมเชิงพื้นที่ ระบบจะจดจำค่ากำหนดนี้ไว้ และจะนำไปใช้เมื่อแอปมีความสามารถในการตั้งค่าสภาพแวดล้อมของตนเอง

val spatialEnvironmentPreference =
    SpatialEnvironment.SpatialEnvironmentPreference(skybox, environmentGeometry)
val preferenceResult =
    session.spatialEnvironment.setSpatialEnvironmentPreference(spatialEnvironmentPreference)
if (preferenceResult == SpatialEnvironment.SetSpatialEnvironmentPreferenceChangeApplied()) {
    // The environment was successfully updated and is now visible, and any listeners
    // specified using addOnSpatialEnvironmentChangedListener will be notified.
} else if (preferenceResult == SpatialEnvironment.SetSpatialEnvironmentPreferenceChangePending()) {
    // The environment is in the process of being updated. Once visible, any listeners
    // specified using addOnSpatialEnvironmentChangedListener will be notified.
}

การใช้งานขั้นสูง

สําหรับ Use Case ขั้นสูงที่ต้องการการควบคุมสภาพแวดล้อมอย่างละเอียดยิ่งขึ้น คุณสามารถใช้การตรวจสอบ SpatialCapabilities และติดตั้งใช้งาน addOnSpatialEnvironmentChangedListener เพื่อระบุเวลาที่คุณต้องการตั้งค่าค่ากําหนดของสภาพแวดล้อมเชิงพื้นที่

ตั้งค่า PassthroughOpacityPreference สําหรับสภาพแวดล้อมเชิงพื้นที่สําหรับแอป

หนึ่งในคอมโพเนนต์ของพื้นหลังเสมือนจริงที่สมจริงของแอปคือพื้นผิวที่ส่งผ่าน ในกรณีนี้ พื้นหลังที่แสดงคือฟีดสดจากกล้องที่หันออกด้านนอกของอุปกรณ์

setPassthroughOpacityPreference ใช้เพื่อตั้งค่าความทึบของโหมดแสดงผลที่คุณต้องการสำหรับแอป วิธีนี้จะตั้งค่ากำหนดเท่านั้นและจะไม่ทำให้เกิดการเปลี่ยนแปลงในทันที เว้นแต่จะมีความสามารถของ SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL เมื่ออุปกรณ์เข้าสู่สถานะที่เปลี่ยนความทึบของโหมดพาสทรูได้ และSpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROLความสามารถดังกล่าวพร้อมใช้งาน ระบบจะใช้ความทึบของโหมดพาสทรูที่ต้องการสำหรับแอปพลิเคชันโดยอัตโนมัติ

ค่าสำหรับค่ากําหนดความทึบแสงของโหมดแสดงผลแบบพาสทรูอยู่ในช่วง 0.0f (ความทึบแสง 0 ซึ่งมองไม่เห็นพื้นผิวของโหมดแสดงผลแบบพาสทรู) ถึง 1.0f (ความทึบแสงเต็ม ซึ่งพื้นผิวของโหมดแสดงผลแบบพาสทรูจะซ่อนสภาพแวดล้อมเชิงพื้นที่) พารามิเตอร์ setPassthroughOpacityPreference เป็นตัวเลขทศนิยมที่อนุญาตค่า Null การตั้งค่าเป็นค่า Null บ่งชี้ว่าแอปไม่มีค่ากําหนดความทึบของพาสทรู และจะส่งการควบคุมพาสทรูกลับไปยังระบบ

การใช้งานพื้นฐาน

ข้อมูลโค้ดนี้จะตั้งค่าความทึบของการส่งผ่าน ระบบจะจดจำค่ากำหนดนี้ไว้ และจะนำไปใช้เมื่อแอปมีความสามารถในการตั้งค่าระดับทึบแสงของโหมดพาสทรู

val preferenceResult = session.spatialEnvironment.setPassthroughOpacityPreference(1.0f)
if (preferenceResult == SpatialEnvironment.SetPassthroughOpacityPreferenceChangeApplied()) {
    // The passthrough opacity request succeeded and should be visible now, and any listeners
    // specified using addOnPassthroughOpacityChangedListener will be notified
} else if (preferenceResult == SpatialEnvironment.SetPassthroughOpacityPreferenceChangePending()) {
    // The passthrough opacity preference was successfully set, but not
    // immediately visible. The passthrough opacity change will be applied
    // when the activity has the
    // SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL capability.
    // Then, any listeners specified using addOnPassthroughOpacityChangedListener
    // will be notified
}

การใช้งานขั้นสูง

สำหรับกรณีการใช้งานขั้นสูงที่คุณต้องการควบคุมความทึบของการส่งผ่านได้ละเอียดยิ่งขึ้น ให้รวมการตรวจสอบ SpatialCapabilities และเพิ่ม Listener โดยใช้ addOnPassthroughOpacityChangedListener เพื่อกำหนดว่าต้องการตั้งค่าค่ากำหนดความทึบของการส่งผ่านเมื่อใด

การเพิ่มประสิทธิภาพชิ้นงาน

เมื่อสร้างชิ้นงานสำหรับตั้งค่า SpatialEnvironment ของผู้ใช้ คุณจะต้องตรวจสอบว่าชิ้นงานมีความละเอียดคุณภาพสูงในขณะที่ยังคงมีขนาดไฟล์ที่เหมาะสม โปรดตรวจสอบว่า glb ใช้พื้นผิวแบบ MIPMAP และ KTX2 นอกจากนี้ คุณควรคำนึงถึงจำนวนพอลิก้อนในไฟล์ glb ด้วย เนื่องจากจำนวนพอลิก้อนที่สูงอาจทำให้สิ้นเปลืองพลังงานโดยไม่จำเป็น ขนาดไฟล์ส่วนใหญ่ของอินสแตนซ์ SpatialEnvironment ส่วนใหญ่มาจากรูปภาพที่ใช้สําหรับท้องฟ้า ตรวจสอบว่ารูปภาพได้รับการเพิ่มประสิทธิภาพแล้วโดยเรียกใช้ชิ้นงานผ่านเครื่องมือเพิ่มประสิทธิภาพ (เช่น ktx)

กำหนดระดับทึบแสงของการส่งผ่านปัจจุบัน

val currentPassthroughOpacity = session.spatialEnvironment.getCurrentPassthroughOpacity()

ดูเพิ่มเติม