Я вижу пару проблем.
Во-первых, аргумент для 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);
}