2016-03-13 1 views
0

У меня есть этот мини-проект, который я делаю с 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(); 

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

+0

OpenGL не является графиком сцены. OpenGL - это API-интерфейс рисования. Если вы хотите, чтобы изображение, видимое в окне, изменилось (и даже что-то простое, как панорама, это изменение), вы должны * перерисовать *. – datenwolf

ответ

1
  1. Почему вы меняете матрицу проекции на A нажатие клавиши?

    Я предполагаю, что вы хотите использовать WSAD (что экстремально неудобно для старой школы OPQAM парней вроде меня), чтобы панорамировать вид.

    Первая проблема заключается в том, что вы меняете GL_PROJECTION на A нажатие клавиши, но реселлируя ее при рендеринге в display(), визуализируйте код нажатия клавиши, ничего не делая. Чтобы исправить это, вы должны ввести GL_PROJECTION в свою функцию init(). Кстати, вам не хватает glMatrixMode и удалите его с display().

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

    что приведет вас к серьезным проблемам, когда вы идете для продвинутых освещения и тумана (если вы не переключитесь на GLSL).

    И, наконец, по мере того как вы устанавливаете вид орто, тогда вы должны кастнуть только с glTranslate Это, по крайней мере, мое мнение.

  2. где хранится ваша сцена?

    Из вашего текста я предположил, что это должен быть простой векторный краска, такой как редактор, способный добавлять/рисовать фигуры в сцену.Таким образом, вы должны иметь какой-то списки, способные хранить всю информацию для вашей сцены, как:

    • типа объекта
    • контрольных точек
    • цвета

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

    Вот посмотрите на:

    для некоторых идей, как это можно сделать.

+0

Я думаю, что вторая часть является ключом, если я добавлю, например, некоторую глобальную переменную float «x_offset» в квадратный рисунок в моей «функции отображения», а нажатие клавиши добавит что-то к этой переменной, все будет работать, но поскольку У меня уже есть большое количество уже сформированных фигур, что я могу сделать, чтобы переместить их все? – argamanza

+0

@argamanza panning означает изменение точки зрения (так что используйте 'glTranslate' на' GL_MODELVIEW' или где бы вы ни находились ваша камера), если вы хотите сместить отредактированные модели (один или выбор или все из них), затем добавить одинаковое смещение ко всем контрольные точки, которые у них есть ... – Spektre

Смежные вопросы