ตอนนี้ ARCore รองรับระบบป้องกันภาพสั่นไหวแบบอิเล็กทรอนิกส์ (EIS) ซึ่งจะช่วยให้การแสดงตัวอย่างจากกล้องเป็นไปอย่างราบรื่น EIS รักษาภาพสั่นไหวด้วยการสังเกตการเคลื่อนไหวของโทรศัพท์โดยใช้เครื่องวัดการหมุนและใช้ Mesh ของการชดเชยค่าชดเชยภายในขอบเขตของพื้นผิวกล้องซึ่งจะช่วยรับมือกับการสั่นสะเทือนของผู้เยาว์ EIS รองรับเฉพาะในแนวตั้งของอุปกรณ์ ARCore รุ่น 1.39.0 จะรองรับการวางแนวทั้งหมด
การค้นหาการรองรับ EIS และเปิดใช้ EIS
หากต้องการเปิดใช้ EIS ให้กำหนดค่าเซสชันให้ใช้ AR_IMAGE_STABILIZATION_MODE_EIS
หากอุปกรณ์ไม่รองรับฟีเจอร์ EIS การดำเนินการนี้จะทำให้มีการส่งข้อยกเว้นจาก ARCore
int enableEis = 0; ArSession_isImageStabilizationModeSupported( ar_session, AR_IMAGE_STABILIZATION_MODE_EIS, &enableEis); if (!enableEis) { return; } // Create a session config. ArConfig* ar_config = NULL; ArConfig_create(ar_session, &ar_config); // Enable Electronic Image Stabilization. ArConfig_setImageStabilizationMode(ar_session, ar_config, AR_IMAGE_STABILIZATION_MODE_EIS); CHECK(ArSession_configure(ar_session, ar_config) == AR_SUCCESS); // Release config resources. ArConfig_destroy(ar_config);
แปลงพิกัด
เมื่อเปิด EIS โหมดแสดงภาพต้องใช้พิกัดอุปกรณ์ที่แก้ไขและพิกัดพื้นผิวที่ตรงกันที่รวมการชดเชย EIS เมื่อแสดงภาพพื้นหลังของกล้อง หากต้องการรับพิกัดที่ชดเชย EIS ให้ใช้ ArFrame_transformCoordinates3d
โดยใช้ AR_COORDINATES_2D_OPENGL_NORMALIZED_DEVICE_COORDINATES
เป็นอินพุต และใช้ AR_COORDINATES_3D_EIS_NORMALIZED_DEVICE_COORDINATES
เป็นเอาต์พุตเพื่อรับพิกัดของอุปกรณ์ 3 มิติและ AR_COORDINATES_3D_EIS_TEXTURE_NORMALIZED
เป็นเอาต์พุตเพื่อรับพิกัดพื้นผิว 3 มิติ ปัจจุบันพิกัดประเภทอินพุตเดียวที่สนับสนุนสำหรับ ArFrame_transformCoordinates3d
คือ AR_COORDINATES_2D_OPENGL_NORMALIZED_DEVICE_COORDINATES
int kNumVertices = 4; // Positions of the quad vertices in clip space (X, Y). const GLfloat kVertices[] = { -1.0f, -1.0f, +1.0f, -1.0f, -1.0f, +1.0f, +1.0f, +1.0f, }; float transformed_vertices_[4 * 3]; float transformed_uvs_[4 * 3]; ArFrame_transformCoordinates3d( session, frame, AR_COORDINATES_2D_OPENGL_NORMALIZED_DEVICE_COORDINATES, kNumVertices, kVertices, AR_COORDINATES_3D_EIS_NORMALIZED_DEVICE_COORDINATES, transformed_vertices_); ArFrame_transformCoordinates3d( session, frame, AR_COORDINATES_2D_OPENGL_NORMALIZED_DEVICE_COORDINATES, kNumVertices, kVertices, AR_COORDINATES_3D_EIS_TEXTURE_NORMALIZED, transformed_uvs_); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_EXTERNAL_OES, camera_texture_id_); glUseProgram(camera_program_); glUniform1i(camera_texture_uniform_, 0); // Set the vertex positions and texture coordinates. glVertexAttribPointer(camera_position_attrib_, 3, GL_FLOAT, false, 0, transformed_vertices_); glVertexAttribPointer(camera_tex_coord_attrib_, 3, GL_FLOAT, false, 0, transformed_uvs_); glEnableVertexAttribArray(camera_position_attrib_); glEnableVertexAttribArray(camera_tex_coord_attrib_);
เมื่อ EIS ปิดอยู่ พิกัด 3 มิติของเอาต์พุตจะเทียบเท่ากับค่าคู่ 2 มิติ โดยตั้งค่า z ไว้ไม่ให้มีการเปลี่ยนแปลง
แก้ไขตัวปรับแสงเงา
พิกัด 3 มิติที่คำนวณได้ควรส่งผ่านไปยังตัวปรับแสงเงาพื้นหลัง ตอนนี้บัฟเฟอร์ Vertex เป็นแบบ 3 มิติด้วย EIS ดังนี้
layout(location = 0) in vec4 a_Position;
layout(location = 1) in vec3 a_CameraTexCoord;
out vec3 v_CameraTexCoord;
void main() {
gl_Position = a_Position;
v_CameraTexCoord = a_CameraTexCoord;
}
นอกจากนี้ ตัวปรับแสงเงาส่วนย่อยต้องใช้การแก้ไขมุมมอง ดังนี้
precision mediump float;
uniform samplerExternalOES u_CameraColorTexture;
in vec3 v_CameraTexCoord;
layout(location = 0) out vec4 o_FragColor;
void main() {
vec3 tc = (v_CameraTexCoord / v_CameraTexCoord.z);
o_FragColor = texture(u_CameraColorTexture, tc.xy);
}
ดูรายละเอียดเพิ่มเติมได้ที่แอปตัวอย่าง hello_eis_kotlin