2015-07-15 2 views
3

Я заменяю свое использование glu-методов в моем проекте с помощью glm, и, похоже, я столкнулся с странной разницей, которую я не могу объяснить. Когда я использую этот код, чтобы установить матрицу проецирования с помощью gluPerspective, я получаю это отображается:glm :: перспектива против gluPerspective

gluPerspective version

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluPerspective(70.0f, (GLfloat)w/(GLfloat)h, 0.0001f, 1000.0f); 

Если я переключаюсь на GLM :: перспективу, я получаю это:

glm::perspective version

glMatrixMode(GL_PROJECTION); 
glm::mat4 projectionMatrix = glm::perspective(70.0f, (GLfloat)w/(GLfloat)h, 0.0001f, 1000.0f); 
glLoadMatrixf(&projectionMatrix[0][0]); 

Совершенно ясно, что объект, который я получаю, теперь занимает больше места с версией glm. Других изменений в двух версиях нет, кроме замены gluPerspective для glm :: перспектива.

Я предполагаю, что я, вероятно, что-то делаю неправильно, потому что я понимаю, что glm :: перспектива должна быть каплей замены gluPerspective. Но я точно не знаю, что это на данный момент.

Кроме того, разница в ориентации заключается в том, что объект вращается в сцене. Я просто закончил снимать скриншот в разное время в анимации.

+0

Обратите внимание, что в использовании glm не слишком много смысла, если вы все равно используете устаревшие функции матрицы. Вы должны использовать шейдерную форму. В любом случае, проверьте, как glm сохраняет свои матрицы независимо от того, хранятся ли они в строке или столбце, и посмотрите, соответствует ли это 'glLoadMatrixf' –

+0

. Я также планирую отказаться от устаревших матричных функций, но это было просто начиная с замены устаревших функций с помощью glm, когда я столкнулся с этой проблемой. Мне также нужно удалить мое использование переутомления. Что касается порядка, то glm должен соответствовать тому, что использует GL, поскольку в противном случае было бы немного сложно использовать. Вызов glLoadMatrix был взят из их документации. –

ответ

5

GLM в настоящее время использует радиан по умолчанию, в то время как gluPerspective() использует градусов, так что вы должны использовать

glm::perspective(glm::radians(70.0f), ...); 

, чтобы получить тот же результат, как gluPerspective(70.0f, ...).

+0

В этом была проблема - я просмотрел документацию для gluPerspective, как в Интернете, так и в файле .hpp, но оба места указаны в фокусах в градусах, а не в радианах. Думаю, я отправлю сообщение об ошибке разработчику. Благодаря! –

+0

Вы знаете, где находится официальная самая последняя документация для glm? Это было мое первое предположение, но документация, которую я нашел, показала, что она находится в градусах. Это похоже на официальную страницу: http://glm.g-truc.net/0.9.6/index.html, и она показывает использование 'перспективы()' с аргументом в градусах справа на заголовок стр. В ссылке API (http://glm.g-truc.net/0.9.6/api/a00171.html#gac3613dcb6c6916465ad5b7ad5a786175) говорится: «Определяет поле угла обзора в градусах по направлению y. радиан «. Так что в лучшем случае это двусмысленно ... –

+1

@RetoKoradi: На самом деле, я не знаю более поздней документации. Я считаю, что документация glm довольно неудовлетворительна. Кажется, всегда указывается только очевидное, которое я могу угадать из имени функции. В этом случае документация кажется ошибочной, поскольку она не обновлялась, когда они решили переключиться с градусов на радианы некоторое время назад. – derhass