ARCore में अब इलेक्ट्रॉनिक इमेज स्टेबलाइज़ेशन (ईआईएस) की सुविधा काम करती है. इससे कैमरे की झलक को बेहतर तरीके से दिखाने में मदद मिलती है. ईआईएस, फ़ोन की हलचल को कम करने के लिए, जियोस्कोप का इस्तेमाल करता है. साथ ही, कैमरे के टेक्सचर की सीमाओं में, कॉम्पेंसेशन होमोग्राफ़ी मेश लागू करता है. इससे, वीडियो में होने वाली छोटी-मोटी झटके वाली हलचल कम हो जाती है. ईआईएस की सुविधा सिर्फ़ डिवाइस के पोर्ट्रेट ओरिएंटेशन में काम करती है. ARCore के 1.39.0 रिलीज़ में सभी ओरिएंटेशन काम करेंगे.
ईआईएस की सहायता के लिए क्वेरी करना और ईआईएस चालू करना
ईआईएस चालू करने के लिए, अपने सेशन को AR_IMAGE_STABILIZATION_MODE_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);
निर्देशांक बदलना
ईआईएस चालू होने पर, रेंडरर को बदले गए डिवाइस कोऑर्डिनेट और मैच करने वाले टेक्सचर कोऑर्डिनेट का इस्तेमाल करना होगा. ये कोऑर्डिनेट, कैमरे के बैकग्राउंड को रेंडर करते समय ईआईएस कंपेसेशन को शामिल करते हैं. ईआईएस से कैप्चर किए गए निर्देशांक पाने के लिए, ArFrame_transformCoordinates3d
का इस्तेमाल करें. इसके लिए, AR_COORDINATES_2D_OPENGL_NORMALIZED_DEVICE_COORDINATES
को इनपुट के तौर पर और AR_COORDINATES_3D_EIS_NORMALIZED_DEVICE_COORDINATES
को आउटपुट के तौर पर इस्तेमाल करें. इससे, 3D डिवाइस के निर्देशांक मिलेंगे. साथ ही, AR_COORDINATES_3D_EIS_TEXTURE_NORMALIZED
को आउटपुट के तौर पर इस्तेमाल करके, 3D टेक्स्चर के निर्देशांक भी मिलेंगे. फ़िलहाल, 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_);
ईआईएस बंद होने पर, आउटपुट के 3D निर्देशांक, उनके 2D निर्देशांक के बराबर होते हैं. साथ ही, z वैल्यू को कोई बदलाव न करने के लिए सेट किया जाता है.
शेडर में बदलाव करना
कैलकुलेट किए गए 3D निर्देशांक, बैकग्राउंड रेंडरिंग शेडर को पास किए जाने चाहिए. वर्टेक्स बफ़र अब ईआईएस के साथ 3D में हैं:
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 सैंपल ऐप्लिकेशन देखें.