Искажение перспективы из-за угла обзораC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Искажение перспективы из-за угла обзора

Сообщение Anonymous »

Ранее в этом месяце я пытался создать программу OpenGL, отображающую куб, полностью с нуля, даже писал свои собственные математические модули.
Я испытываю искажение перспективы при запуске программы: p>
Функция перспективной проекции:

Код: Выделить всё

void Matrix4f::perspective(float ratio, float fov, float view_near, float view_far) {
float half_tan = std::tan(radians(fov) / 2.0f);
float z_range = view_far - view_near;

float m0 = 1.0f / ratio * half_tan;
float m5 = 1.0f / half_tan;
float m10 = -(view_far + view_near) / z_range;
float m11 = -(2.0f * view_far * view_near) / z_range;

this->m[0] = m0;
this->m[5] = m5;
this->m[10] = m10;
this->m[11] = m11;
this->m[14] = -1.0f;
}

Функция просмотра:

Код: Выделить всё

void Matrix4f::look_at(Vector3f eye, Vector3f lookat, Vector3f up) {
Vector3f z_axis = (lookat - eye).normalize();

Vector3f x_axis = z_axis.cross(up).normalize();

Vector3f y_axis = x_axis.cross(z_axis);

float result[] = {
x_axis.x, x_axis.y, x_axis.z, -x_axis.dot(eye),
y_axis.x, y_axis.y, y_axis.z, -y_axis.dot(eye),
-z_axis.x, -z_axis.y, -z_axis.z, z_axis.dot(eye),
0, 0, 0, 1
};

for (int i = 0; i < 16; i++) {
this->m[i] = result[i];
}
}

Единый код местоположения:

Код: Выделить всё

this->shader_program->uniform_matrix4fv("projection", this->projection.m, false);
this->shader_program->uniform_matrix4fv("camera", this->camera.m, true);
this->shader_program->uniform_matrix4fv("transform", transform.m, false);
this->shader_program->uniform_matrix4fv("scale", scale.m, false);
this->shader_program->uniform_matrix4fv("rotation", rotation.m, false);

FOV = 90 градусовFOV = 90,0f
FOV = 60 градусов FOV = 60,0f
Когда я называю это this->projection.perspective ((float)w/(float)h, FOV, 1.0f, 1000.0f); с полем зрения 90 градусов оно выглядит пропорционально, но когда я вызываю его с полем зрения 60 градусов, размер куба уменьшается вдвое. Я уменьшил поле зрения, так как когда я посмотрел, мне сказали уменьшить поле зрения, чтобы уменьшить эффект «рыбьего глаза» или искажение. Видимо, это сработало не так, как я хотел.

Подробнее здесь: https://stackoverflow.com/questions/784 ... sis-of-fov
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»