直交遠近法を使用している場合は、これを使用します。
#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;
}
左マウスを使用してコンテンツ (三角形) をドラッグできます。