У меня есть этот мини-проект, который я делаю с C++/OpenGL, который позволяет пользователю рисовать фигуры на экране с помощью мыши.Перемещение текущих чертежей с использованием Ortho2D не работает в GLUT
Теперь я хочу разрешить пользователю перемещать/панорамировать экран влево и вправо, используя свою клавиатуру, скажем, что на экране есть 4 фигуры на экране, я хочу, чтобы все они двигались влево, когда клавиша «А» нажат.
Мне уже удалось сделать это в предыдущем проекте и даже увеличить/уменьшить масштаб, но в этой программе что-то просто не работает, самое близкое, что мне удалось сделать, это то, что все новые пользователи форм создают после Клавиша «А» нажата на новом месте вместо того, где находится его мышь.
Вот мое главное, первонач, дисплей и код клавиатуры:
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(W_WIDTH, W_HEIGHT);
glutInitWindowPosition(100, 100);
glutCreateWindow("OpenGL Excercise");
init();
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutPassiveMotionFunc(My_mouse_routine);
createMenu();
glutMainLoop();
}
void init()
{
// Select a clear color
glClearColor(0.933, 0.933, 0.933, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
gluOrtho2D(0, W_WIDTH, W_HEIGHT, 0);
}
void display() {/* clear all pixels */
// draw text at the bottom
char* text_to_draw = "Press right mouse button for menu...";
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluOrtho2D(0, W_WIDTH, 0, W_HEIGHT);
glColor3f(0.129, 0.129, 0.129);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glRasterPos2i(10, W_HEIGHT - 15); // move in 10 pixels from the left and bottom edges
for (int i = 0; i < (int)strlen(text_to_draw); ++i) {
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, text_to_draw[i]);
}
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glFlush();
}
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 27:
exit(0);
case 'A':
case 'a':
glMatrixMode(GL_PROJECTION); //start editing the projection matrix
glLoadIdentity(); //remove current projection
glPopMatrix();
gluOrtho2D(1,0,1,0); //create new one
glPushMatrix();
glMatrixMode(GL_MODELVIEW); //back to editing the modelview matrix
glFlush();
default:
break;
}
glutPostRedisplay();
}
И, наконец, вот пример для прямоугольника чертежа:
GLfloat colors[][3] = { { 0.957f, 0.263f, 0.212f },{ 0.298f, 0.686f, 0.314f },{ 0.129f, 0.588f, 0.953f }, };
static int col = 0;
glColor3f(colors[col][0], colors[col][1], colors[col][2]);
glBegin(GL_POLYGON);
glVertex3f(mouse_x - 50, mouse_y - 50, 0.0);
glVertex3f(mouse_x + 50, mouse_y - 50, 0.0);
glVertex3f(mouse_x + 50, mouse_y + 50, 0.0);
glVertex3f(mouse_x - 50, mouse_y + 50, 0.0);
glEnd(); /* don't wait!!! start processing buffered OpenGL routines */
col += 1;
if (col == sizeof(colors)/sizeof(colors[0])) {
col = 0;
}
glutPostRedisplay();
Я знаю, что есть много вопросов по этому поводу выпуск на этом сайте и сотни других сайтов, и я почти уверен, что это имеет какое-то отношение к матрицам, но я понятия не имею, что я делаю неправильно.
OpenGL не является графиком сцены. OpenGL - это API-интерфейс рисования. Если вы хотите, чтобы изображение, видимое в окне, изменилось (и даже что-то простое, как панорама, это изменение), вы должны * перерисовать *. – datenwolf