Это правильная перспективная матрица FOV? - PullRequest
4 голосов
/ 19 мая 2011

У меня есть перспективное поле зрения, но при повороте он не выглядит «правильно» - более дальние объекты перемещаются быстрее, чем более близкие объекты, пропуская их в середине экрана.

Итак: это правильно??Использование правосторонних координат, если это имеет значение?

    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 ]

7 голосов
/ 25 мая 2012

Я вижу пару проблем. Во-первых, аргумент для tan () должен быть преобразован из градусов в радианы.

Во-вторых, формула для перспективного проецирования в OpenGL немного отличается от вашей. Как указано здесь , он использует «ближний-дальний» в знаменателе вместо вашего «дальний-ближний». Термины числителя также различны. Слегка изменив вашу функцию и преобразовав ее из Java в C, я создал матрицу проекции, идентичную матрице gluPerspective (), со следующими данными:

static void my_PerspectiveFOV(double fov, double aspect, double near, double far, double* mret) {
    double D2R = M_PI / 180.0;
    double yScale = 1.0 / tan(D2R * fov / 2);
    double xScale = yScale / aspect;
    double nearmfar = near - far;
    double m[] = {
        xScale, 0, 0, 0,
        0, yScale, 0, 0,
        0, 0, (far + near) / nearmfar, -1,
        0, 0, 2*far*near / nearmfar, 0 
    };
    geom_matrix4_copy(m, mret);
}
3 голосов
/ 23 сентября 2013

Для таких вопросов, как этот, я бы предложил отличные ресурсы: http://scratchapixel.com/lessons/3d-advanced-lessons/perspective-and-orthographic-projection-matrix/ Это действительно идет в деталях матрицы проекции. Это больше уроков на тему камеры, построения лучей камеры и т. Д. Вам нужно будет немного покопаться.

...