Это правильная перспективная матрица FOV?
У меня есть перспективное поле зрения, но при вращении он не выглядит "правильно" - более дальние объекты перемещаются быстрее, чем более близкие объекты, пропуская их в середине экрана.
Итак: это правильно? Использование правосторонних координат, если это имеет значение?
public static Matrix4x4 PerspectiveFOV(float fov, float aspect, float near, float far)
{
float yScale = 1.0F / (float)Math.Tan(fov / 2);
float xScale = yScale / aspect;
float farmnear = far - near;
return new Matrix4x4(
xScale, 0, 0, 0,
0, yScale, 0, 0,
0, 0, far / (farmnear), 1,
0, 0, -near * (far / (farmnear)), 1
);
}
Благодарю.
2 ответа
Я вижу пару проблем. Во-первых, аргумент tan() должен быть преобразован из градусов в радианы.
Во-вторых, формула для перспективного проецирования в OpenGL немного отличается от вашей. Как указано здесь, он использует "ближний-дальний" в знаменателе вместо вашего "дальний-ближний". Термины числителя также различны. Слегка изменив вашу функцию и преобразовав ее из Java в C, я создал матрицу проекции, идентичную матрице gluPerspective(), со следующими данными:
static void my_PerspectiveFOV (двойное поле зрения, двойное изображение, двойное расстояние, двойное расстояние, двойное * mret) { двойной D2R = M_PI / 180,0; double yScale = 1,0 / tan(D2R * fov / 2); двойной xScale = yScale / аспект; двойная близость = ближняя - дальняя; двойной м [] = { xScale, 0, 0, 0, 0, yScale, 0, 0, 0, 0 (далеко + близко) / ближний, -1, 0, 0, 2* далеко * ближний / ближний, 0 }; geom_matrix4_copy(м, мрет); }
Для таких вопросов, как этот, я бы предложил отличные ресурсы: http://scratchapixel.com/lessons/3d-advanced-lessons/perspective-and-orthographic-projection-matrix/ Это действительно идет в деталях матрицы проекции. Это больше уроков по теме камеры, конструирования лучей камеры и т. Д. Вам нужно будет немного покопаться.