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