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

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

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

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

พื้นหลังเสมือนจริงแสดงภาพรอบตัวที่ผู้ใช้เห็นในฉากเสมือนจริง ซึ่งสร้างภาพลวงตาของสภาพแวดล้อมเบื้องหลังที่ไกลออกไป เช่น ท้องฟ้า ภูเขา หรือภาพเมือง ผู้ใช้ไม่สามารถโต้ตอบหรือเข้าใกล้ฉากหลังได้ 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 สามารถใช้เป็นส่วนหนึ่งของสภาพแวดล้อมแอปเชิงพื้นที่ได้

// assume that session is a Session that has been previously created
val environmentGeometryFuture = session.createGltfResourceAsync("DayGeometry.glb")

val environmentGeometry = environmentGeometryFuture.await()

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

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

// assume that session is a Session that has been previously created
val skyboxExrFuture = session.createExrImageResourceAsync("BlueSkybox.exr")

val skyboxExr = skyboxExrFuture.await()

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

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

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

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

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

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

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

// Assume that session is a Session that has been previously created

// Create a GLTFResource
val environmentGeometry = session.createGltfResourceAsync("DayGeometry.glb").await()

// Create an ExrImage for the skybox
val skyboxExr = session.createExrImageResourceAsync("BlueSkybox.exr").await()

val spatialEnvironmentPreference = SpatialEnvironmentPreference(skyboxExr, 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 บ่งชี้ว่าแอปไม่มีค่ากําหนดความทึบของพาสทรู และจะส่งการควบคุมพาสทรูกลับไปยังระบบ

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

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

// Assume that session is a Session that has been previously created

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 และใช้ addOnPassthroughOpacityChangedListener เพื่อกําหนดว่าต้องการตั้งค่าค่ากําหนดความทึบของการส่งผ่านเมื่อใด

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

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

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

val currentPassthroughOpacity =  session.spatialEnvironment.getCurrentPassthroughOpacity()

ดูเพิ่มเติม