Изменить размер окна GLUT без изменения размера содержимого?

Я не мог добиться следующего поведения. Я хочу изменить размер моего окна снизу, не искажая визуализированную сцену и не меняя ее положение.

введите описание изображения здесь

Я использую C ++ OpenGL GLUT

void resize(int w, int h)
{
float ratio = G_WIDTH / G_HEIGHT;
glViewport(0, 0, (h-(w/ratio))>0? w:(int)(h*ratio), (w-(h*ratio))>0? h:(int)(w/ratio));
}

2

Решение

В функции изменения размера сцены GLUT видовой экран, вероятно, по умолчанию настроен на размер окна. Я бы попробовал просто изменить его на (фиксированный) размер, который вы хотите:

Вместо:

void windowReshapeFunc( GLint newWidth, GLint newHeight )
{
glViewport( 0, 0, newWidth, newHeight );
.. etc...
}

Сделай это:

void windowReshapeFunc( GLint newWidth, GLint newHeight )
{
glViewport( 0, 0, 400, 600 );
.. etc...
}

Или любой другой размер. Размер окна будет по-прежнему изменяться, но эта сцена всегда будет отображаться в (теперь исправленном) окне просмотра.

3

Другие решения

если вы используете ортогональную перспективу, используйте это:

#include <GL/glut.h>

int x0, y0 = 0;
int ww, hh = 0;

void updateCamera()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(x0, x0+ww, y0, y0+hh, -1, 1);
glScalef(1, -1, 1);
glTranslatef(0, -hh, 0);
}

void reshape(int w, int h)
{
ww = w;
hh = h;
glViewport(0, 0, w, h);
updateCamera();
}

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glColor3f(0.0, 0.0, 1.0); glVertex2i(0, 0);
glColor3f(0.0, 1.0, 0.0); glVertex2i(200, 200);
glColor3f(1.0, 0.0, 0.0); glVertex2i(20, 200);
glEnd();
glFlush();
glutPostRedisplay();
}

int mx = 0;
int my = 0;
int dragContent = 0;

void press(int button, int state, int x, int y)
{
mx = x;
my = y;
dragContent = button == GLUT_LEFT_BUTTON && state == GLUT_DOWN;
}

void move(int x, int y)
{
if(dragContent)
{
x0 -= x - mx;
y0 += y - my;
mx = x;
my = y;
updateCamera();
}
}

int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutCreateWindow("Resize window without resizing content + drag content");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMouseFunc(press);
glutMotionFunc(move);
glutMainLoop();
return 0;
}

Вы можете использовать левую мышь для перетаскивания содержимого (треугольник).

2

ratio = wantedWidth / wantedHeight
glViewport(0, 0,
(height-(width/ratio))>0? width:(int)(height*ratio),
(width-(height*ratio))>0? height:(int)(width/ratio);

если бы он делал это, он всегда сохранял соотношение между высотой / шириной окна, одновременно пытаясь использовать максимальный размер доступного окна.

Изменить: поместите его всегда в верхний левый угол.

1

Вот решение, которое я нашел, которое, я думаю, работает довольно хорошо.

Я написал свой метод изменения формы следующим образом, который зарегистрирован glutReshapeFunc(reshape) в моем основном методе:

void reshape(int width, int height) {
glViewport(0, 0, width, height);
aspect = ((double) width) / height;

И всякий раз, когда я перерисовываю сцену, я использую этот вызов, чтобы установить камеру:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, aspect, 1.0, 100.0); // 45 degrees fovY, correct aspect ratio
// then remember to switch back to GL_MODELVIEW and call glLoadIdentity

Это позволяет мне рассматривать окно как окно в моей сцене, не масштабируя и не перемещая сцену. Я надеюсь, что это то, что вы ищете!

1
По вопросам рекламы [email protected]