অ্যান্ড্রয়েড এনডিকে (সি) এ ক্যামেরার ছবি স্থির করুন

ARCore এখন ইলেকট্রনিক ইমেজ স্ট্যাবিলাইজেশন (EIS) সমর্থন করে, যা একটি মসৃণ ক্যামেরা প্রিভিউ তৈরি করতে সাহায্য করে। ইআইএস গাইরো ব্যবহার করে ফোনের গতিবিধি পর্যবেক্ষণ করে এবং ক্যামেরা টেক্সচারের সীমানার মধ্যে ক্ষতিপূরণ হোমোগ্রাফি জাল প্রয়োগ করে স্থিতিশীলতা অর্জন করে যা ছোট ঝাঁকুনিকে কাউন্টার করে। 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 পান 3D টেক্সচার স্থানাঙ্ক পেতে আউটপুট হিসাবে D_EIS_TEXTURE_NORMALIZED। আপাতত, 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 বন্ধ থাকে, আউটপুট 3D স্থানাঙ্কগুলি তাদের 2D সমকক্ষের সমতুল্য, z মানগুলি কোন পরিবর্তন আনতে সেট করে না।

শেডার পরিবর্তন করুন

গণনা করা 3D স্থানাঙ্কগুলি ব্যাকগ্রাউন্ড রেন্ডারিং শেডারগুলিতে পাস করা উচিত৷ ভার্টেক্স বাফারগুলি এখন EIS সহ 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 নমুনা অ্যাপটি দেখুন।