2015-01-08 6 views
0

В настоящее время я пытаюсь создать функцию Perspective, которая дает проекцию для OpenGL. Я создал много, много способов, последнюю реплицирующую функцию GLM, которая ее обрабатывает (я должен использовать свой собственный класс Matrix4 для моего назначения). Независимо от того, какой код я пытаюсь, я всегда получаю неправильные числа по сравнению с GLM, что приводит к тому, что мой куб только рендерит с помощью GLM.Матрица проекции дает неправильные результаты

Они оба инициализированы с тем же переменными

glm::mat4 ProjectionGLM = glm::perspective(45.0f, 4.0f/3.0f, 0.1f, 100.0f); 
Matrix4 Projection = Matrix4::Perspective(45.0f, 4.0f/3.0f, 0.1f, 100.0f); 

функция Perspective

Matrix4 Matrix4::Perspective(double fov, double aspect, double zNear, double zFar) { 
double fovy = fov * 0.0174532925; 

double const tanHalfFovy = tan(fovy/2.0f); 

Matrix4 temp; 
temp.data[0][0] = 1.0f/(aspect * tanHalfFovy); 
temp.data[1][1] = 1.0f/(tanHalfFovy); 
temp.data[2][2] = -(zFar + zNear)/(zFar - zNear); 
temp.data[2][3] = -1.0f; 
temp.data[3][2] = -(2.0f * zFar * zNear)/(zFar - zNear); 
return temp; 

кодом непосредственно смоделированные GLM-х, за вычетом static_cast-х и шаблонами. Это та же математика, что и многие другие функции, которые я пробовал. Однако результирующая матрица отличается.

GLM результат

1.34444320 0   0   0 
0   1.79259098 0   0 
0   0   -1.00200200 -1.00000000 
0   0   -0.200200200 0 

Мои результаты

1.81066012 0   0   0 
0   2.41421366 0   0 
0   0   -1.00200200 -1.00000000 
0   0   -0.200200200 0 

Любая идея о том, что может быть не так с моей точки зрения функции или что GLM можно было бы делать по-другому?

Ссылка на моей математической библиотеки (только .h и .cpp файлов) https://mega.co.nz/#!lokhCBaB!5r7GwpWhEZ-tUcXV_ccxmQvZgRwIVU8K7dlIffVqZic

+0

GLM использует радианы, код градусов ... – peppe

+0

Это может быть уместным: HTTP: //stackoverflow.com/questions/3058552/raw-opengl -equivillant-of-gluperspective – NoChance

+0

Я конвертирую FoV в радианы в первой строке функции. –

ответ

1

GLM занимает угол FOV в радианах, в то время как значение вы передаете (45.0) в градусах.

GLM documentation для параметра примерно так же неясно, как это может быть:

Указывает поле угла обзора, в градусах, в направлении у. Выражается в радианах.

Да, это говорит, что оно находится в градусах и в радианах. Но если вы посмотрите на исходный код, это действительно радианы.

Это соответствует вашему результату. Для матричного элемента [2][2], который является:

1.0/tan(0.5 * fov) 

Оценивается с функцией tan() работает в радианах, это производит следующее при использовании 45.0 непосредственно:

1.0/tan(0.5 * 45.0) = 1.0/tan(22.5) = 1.79251 

При преобразовании угла в радианах первый:

1.0f/tan(0.5 * 45.0 * pi/180.0) = 1.0/tan(0.3927) = 2.41421 

Итак, если вы преобразуете угол ввода для версий GLM в радианы, мой прогноз состоит в том, что вы w плохо получить такое же значение, что и Вы вычислили себя:

glm::mat4 ProjectionGLM = glm::perspective(45.0f * M_PI/180.0f, 4.0f/3.0f, 0.1f, 100.0f); 
+0

Большое спасибо за это, я был так смущен на входе GLM. Я изменил свой код и получил тот же результат, что и GLM. –

Смежные вопросы