ใน 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()