Я давно хотел поэкспериментировать с физикой платформеров с помощью freeglut, но прежде чем я позволил себе начать, мне нужно было решить одну старую проблему.
Видите ли, я хочу написать обработчик изменения формы, который не только поддерживает масштаб и устраняет любые искажения вида, но также позволяет всем фигурам на экране сохранять свой размер, даже если окно слишком маленькое, чтобы вместить их (т.е. быть обрезанным).
Я почти решил все три части, но когда я масштабирую свое окно, круг, который я нарисовал в нем, масштабируется немного. В противном случае я получил отсечение и устранил искажение. Обновление. Я хочу создать программу, поддерживающую масштаб и соотношение сторон независимо от размера окна.
Вот мой код:
void reshape(int nwidth,int nheight)
{
glViewport(0,0,nwidth,nheight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//here begins the code
double bound = 1.5;
double aspect = double(nwidth)/nheight;
//so far, I get the best results by normalizing the dimensions
double norm = sqrt(bound*bound+aspect*aspect);
double invnorm = sqrt(bound*bound+(1/aspect)*(1/aspect));
if(nwidth <= nheight)
glOrtho(-bound/invnorm,bound/invnorm,-bound/aspect/invnorm,bound/aspect/invnorm,-1,1);
else
glOrtho(-bound*aspect/norm,bound*aspect/norm,-bound/norm,bound/norm,-1,1);
//without setting the modelview matrix to the identity form,
//the circle becomes an oval, and does not clip when nheight > nwidth
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
Обновление: по предложению г-на Коулмана я попытался заменить одинарную точность на двойную. Проблема масштабирования по вертикальной оси улучшилась, но всякий раз, когда я перетаскиваю горизонтальную ось в любом направлении, фигура по-прежнему заметно масштабируется. Это по-прежнему одна и та же форма повсюду, но визуальный осмотр говорит мне, что форма имеет другой размер, когда окно имеет размер 150x300, и когда окно имеет размер 600x800, независимо от того, какой glOrtho выполняется.
glOrtho (...)
принимаетGLdouble
параметров. Рассматривали ли вы возможность использования в своих расчетах двойной точности вместо одинарной? - person Andon M. Coleman   schedule 30.03.2014