Я испытываю искажение перспективы при запуске программы: 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 = 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
Мобильная версия