2013-12-18 5 views
2

У меня есть программа, чтобы сделать дополненную реальность и в OpenGL я использую:glFrustum, gluPerspective и FOV

glFrustum(-near*centerImageX/(GLfloat)fx, near*(imageWidth-centerImageX)/(GLfloat)fx, near*(centerImageY-imageHeight)/(GLfloat)fy, near*centerImageY/(GLfloat)fy, near, far); 

Это нормально, я получаю хорошую перспективу и мой 3D объект хорошо вставлен на моей фотографии. Теперь я хотел бы иметь возможность увеличения/уменьшения масштаба. Обычно это делается путем изменения fov в gluPerspective, но я не использую gluPerspective, потому что я не могу получить хорошую вставку.

С http://dmi.uib.es/~josemaria/files/OpenGLFAQ/transformations.htm, вопросом "? 9,085 Как я могу сделать вызов glFrustum(), который соответствует моему призыву к gluPerspective()", я попытался с:

fov=360.0*atan(imageHeight/(2*fy))/Pi; //computed with parameters top and bottom of my glFrustum 
aspect=-centerImageY*fx/(fy*(centerImageX-imageWidth)); //computed with parameters left and bottom of my glFrustum 

ничтожной glFrustum (GLdouble влево, GLdouble права , GLdouble bottom, GLdouble top, GLdouble рядом, GLdouble далеко);

void gluPerspective (GLdouble fovy, GLdouble aspect, GLdouble near, GLdouble far);

И потом:

gluPerspective(fov, aspect, near, far); 

Но мой объект искажен, это не масштабируется корректно по всем осям, отношение не сохраняется.

Так что мне нужно сделать/изменить в моих параметрах glFrustum, чтобы получить эффект увеличения/уменьшения?

+0

Я думаю, что ваше вычисление границ для ближней плоскости 'glOrtho (...) 'может быть неправильным. У вас есть левая и нижняя плоскости усечения, начинающиеся в центре. Обычно центром будет ... центр. Я бы ожидал увидеть нечто вроде 'near * (centerImageX-imageWidth/2.0)/(GLfloat) x, рядом * (centerImageX + imageWidth/2.0)/(GLfloat) x'. Если вы правильно их вывели, соотношение сторон должно быть связано с отношением 'imageHeight' к' imageWidth' и не имеет ничего общего с 'centerImageX'. Если я не пропущу что-то фундаментальное здесь. –

ответ

0

Как правило, это не делается путем изменения fov в gluPerspective().

Как правило, вы применяете преобразования к модели и/или матрице просмотра в этом отношении. Если вы хотите переместить модель, вы обычно делаете это в Матрице моделей. Если вы хотите изменить «положение камеры», вы обычно делаете это в Матрице просмотра.

В вашем случае вы, вероятно, переводите View Matrix. Поскольку это будет разрешено в иллюзии вашего 3D-объекта, движущегося или приближающегося ближе к камере.

Если вы все еще используете конвейер с фиксированной функцией, вы можете выполнить эти изменения, вызвав некоторые из следующих функций.

  • glMatrixMode(x); - где х является либо GL_PROJECTION_MATRIX или GL_MODELVIEW_MATRIX
  • glLoadIdentity(); - "Сброс" текущая выбранная матрица.
  • glTranslate*(x, y, z);
  • glRotate*(angle, x, y, z);
  • glScale*(x, y, z);

Хотя, если вы используете современные OpenGL, то не использовать выше (который вы на самом деле не может потом). Вместо этого вы хотите сами рассчитать все матричные преобразования и передать их в свой шейдер. Если вы не хотите самостоятельно вычислять все эти расширенные операции с матрицами, вы можете получить что-то вроде GLM (математика OpenGL).

+0

Наконец, я сохранил glFrustum, и я просто умножил матрицу преобразования на коэффициент масштабирования, и он сделал то, что я хотел. Благодаря! – SteveTJS

+0

@SteveTJS: Я понимаю, что это поздно, но если это решит вашу проблему, вы должны проголосовать и принять ответ. – ray

+0

Небольшой педантичный (а также поздний), но на самом деле «зум» _should_ изменить перспективное FOV. Перевод матрицы представлений будет эквивалентен «тележке». Это тонкое различие, но на практике они выглядят по-разному. – criptych