2011-04-21 2 views
2

Я пытаюсь нарисовать простой квадрат, где я нажимаю левую кнопку мыши, используя opengl/glut. Моя программа работает отлично, за исключением той части, где она находится нет нарисуйте квадрат, где я нажимаю левую кнопку мыши :). Может кто-то указать, что я делаю неправильно?Нарисуйте квадрат в opengl в позиции мыши

#include <stdlib.h> 
#include <glut.h> 

GLsizei WIDTH = 1300, HEIGHT = 700; 
GLsizei MOUSEx, MOUSEy; 
GLfloat SIDE=1; 

GLfloat RED[3] = {1,0,0}; 
GLfloat GREEN[3] = {0,1,0}; 
GLfloat BLUE[3] = {0,0,1}; 
GLfloat WHITE[3] = {1,1,1}; 
GLfloat BLACK[3] = {0,0,0}; 
GLfloat YELLOW[3] = {1,1,0}; 
GLfloat CYAN[3] = {0,1,1}; 
GLfloat MAGENTA[3] = {1,0,1}; 

void drawSquare(int x, int y) 
{ 
    glColor3fv(YELLOW); 
    glBegin(GL_POLYGON); 
     glVertex3f(x+SIDE, y+SIDE,0); 
     glVertex3f(x-SIDE, y+SIDE,0); 
     glVertex3f(x-SIDE, y-SIDE,0); 
     glVertex3f(x+SIDE, y-SIDE,0); 
    glEnd(); 
    glFlush(); 
} 

void drawSquare1() 
{ 
    int x=0,y=0; 
    glColor3fv(BLUE); 
    glBegin(GL_POLYGON); 
     glVertex3f(x+SIDE, y+SIDE,0); 
     glVertex3f(x-SIDE, y+SIDE,0); 
     glVertex3f(x-SIDE, y-SIDE,0); 
     glVertex3f(x+SIDE, y-SIDE,0); 
    glEnd(); 
    glFlush(); 
} 

void display (void) { 
    glClearColor (0.0,0.0,0.0,1.0); 
    glClear (GL_COLOR_BUFFER_BIT); 
    glLoadIdentity(); 
    glTranslatef(0,0,-5); 
    drawSquare1(); 
    glFlush(); 
} 

void reshape (int w, int h) { 
    glViewport (0, 0, (GLsizei)w, (GLsizei)h); 
    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective (60, (GLfloat)w/(GLfloat)h, 1.0, 100.0); 
    glMatrixMode (GL_MODELVIEW); 
    WIDTH=w; 
    HEIGHT=h; 
} 

void setX(int x) 
{ 
    MOUSEx=x; 
} 

void setY(int y) 
{ 
    MOUSEy=y; 
} 

void mouse(int btn, int state, int x, int y) 
{ 
    if(btn==GLUT_LEFT_BUTTON && state==GLUT_DOWN) 
    { 
     setX(x); 
     setY(y); 
     drawSquare(MOUSEx,HEIGHT-MOUSEy); 
     glutPostRedisplay(); 
    } 
    if(btn==GLUT_RIGHT_BUTTON && state==GLUT_DOWN) 
    { 
     exit(1); 
    } 
} 

int main (int argc, char **argv) { 
    glutInit (&argc, argv); 
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowSize (WIDTH, HEIGHT); 
    glutInitWindowPosition (10, 10); 
    glutCreateWindow ("New Window"); 
    glutDisplayFunc (display); 
    glutReshapeFunc (reshape); 
    glutMouseFunc(mouse); 
    //glutMotionFunc(drawSquare); 
    glutMainLoop(); 
    return 0; 
} 

ответ

7

Вкратце: OpenGL не является графом сцены. Это означает, что команды рисования, созданные в обработчике мыши, не создают своего рода «постоянство».

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

+0

Даже на один квадрат? – Rizwan

+0

Речь идет не о количестве вещей, которые вы рисуете. Это концептуальная вещь. OpenGL - это «просто» сложный API рисования. Как только вы отправили геометрию в OpenGL, она растеризуется и забывает об этом. – datenwolf

+0

Я понимаю, но я только что увидел еще один фрагмент кода, в котором человек рисовал, дважды щелкнув мышью (для противоположных углов), и он смог нарисовать несколько прямоугольников без использования каких-либо массивов или списков, всего четыре глобальных переменных для двух x, y. Кажется, это почти то, что я пытаюсь сделать. – Rizwan

4

Я свежусь к этому кодированию. Но я сделал это.

Здесь мой код будет работать.

#include <GL/glut.h> 
GLsizei MOUSEx=0, MOUSEy=0; 
GLfloat SIDE=50; 
GLfloat BLUE[3] = {0,0,1}; 

void drawSquare1() 
{ 
    glColor3fv(BLUE); 
    glBegin(GL_POLYGON); 
     glVertex3f(MOUSEx, MOUSEy,0); 
     glVertex3f(MOUSEx+SIDE, MOUSEy,0); 
     glVertex3f(MOUSEx+SIDE, MOUSEy+SIDE,0); 
     glVertex3f(MOUSEx, MOUSEy+SIDE,0); 
    glEnd(); 
    glFlush(); 
} 

void display(void) 
{ 
    glClearColor (0.0,0.0,0.0,1.0); 
    glClear (GL_COLOR_BUFFER_BIT); 
    glLoadIdentity(); 
    drawSquare1(); 
    glFlush(); 
} 
void reshape(int w, int h) 
{ 
    glViewport(0,0,(GLsizei)w,(GLsizei)h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    //gluPerspective (60, (GLfloat)w/(GLfloat)h, 1.0, 100.0); 
    glOrtho(0.0,1368,768,0,-1.0,1.0); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 

void spindisplay(void) 
{  
    glutPostRedisplay(); 
} 

void setX(int x) 
{ 
    MOUSEx=x; 
} 

void setY(int y) 
{ 
    MOUSEy=y; 
} 
void mouse(int btn, int state, int x, int y) 
{ 
    if(btn==GLUT_LEFT_BUTTON && state==GLUT_DOWN) 
    { 
     setX(x); 
     setY(y); 
     //drawSquare(MOUSEx,HEIGHT-MOUSEy); 
     glutPostRedisplay(); 
    } 
    if(btn==GLUT_RIGHT_BUTTON && state==GLUT_DOWN) 
    { 
     exit(1); // To Exit the Program 
    } 
} 
int main(int argc, char **argv) 
{ glutInit(&argc,argv); 
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 
    glutInitWindowSize(1366,768); 
    glutInitWindowPosition(0,0); 
    glutCreateWindow("Moving squares"); 
    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 
    glutMouseFunc(mouse); 
    glutIdleFunc(spindisplay); 
    glutMainLoop(); 
} 
1

Ниже приведен пример кода, взятый из OpenGL Projects. Попробуйте выполнить это, и я думаю, что проблема с вашими квадратами рисования в OpenGL будет легко решена. Если какой-либо вопрос будет любезно просить.

#include<stdlib.h> 
    #include<glut.h> 
    GLsizei wh=500,ww=500; 
    GLfloat size=3.0; 

    void display() 
    { 
    glFlush(); 
    } 

    void myInit() 
    { 
     glViewport(0,0,ww,wh); 
     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     gluOrtho2D(0.0,(GLdouble)ww,0.0,(GLdouble)wh); 
     glMatrixMode(GL_MODELVIEW); 
     glClearColor(0.0,0.0,0.0,1.0); 
     glColor3f(1.0,0.0,0.0); 
    } 

    void myReshape(GLsizei w,GLsizei h) 
    { 
     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     gluOrtho2D(0.0,(GLdouble)w,0.0,(GLdouble)h); 
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
     glViewport(0,0,w,h); 
     ww=w; 
     wh=h; 
    } 

    void drawSquare(int x,int y) 
    { 

     y=wh-y; 
     glBegin(GL_POLYGON); 
     glVertex2f(x+size,y+size); 
     glVertex2f(x-size,y+size); 
     glVertex2f(x-size,y-size); 
     glVertex2f(x+size,y-size); 
     glEnd(); 
     glFlush(); 

    } 

    void size_menu(int id) 
    { 
     switch(id) 
     { 
     case 2: size=size*2; 
       break; 
     case 3:if(size>1) size=size/2; 
     break; 
     } 
     glutPostRedisplay(); 
    } 

    void top_menu(int id) 
    { 
     switch(id) 
     { 
     case 1:exit(0);break; 
     } 
     glutPostRedisplay(); 
    } 

    void myMouse(int button,int state,int x,int y) 
    { 
     if(button==GLUT_LEFT_BUTTON&&state==GLUT_DOWN) 
     drawSquare(x,y); 
     if(button==GLUT_RIGHT_BUTTON&&state==GLUT_DOWN) 
      exit(0); 
    } 

    int main(int argc,char **argv) 
    { 
     int sub_menu; 
     glutInit(&argc,argv); 
     glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 
     glutInitWindowSize(500,500); 
     glutCreateWindow("Hierarchical Menus to Draw Squares"); 
     glutDisplayFunc(display); 
     myInit(); 
     glutMouseFunc(myMouse); 
     sub_menu=glutCreateMenu(size_menu); 
     glutAddMenuEntry("Increase Square Size",2); 
     glutAddMenuEntry("Decrease Square Size",3); 
     glutCreateMenu(top_menu); 
     glutAddMenuEntry("Quit",1); 
     glutAddSubMenu("Resize",sub_menu); 
     glutAttachMenu(GLUT_RIGHT_BUTTON); 
     glutReshapeFunc(myReshape); 
     glClear(GL_COLOR_BUFFER_BIT); 
     glutMainLoop(); 
     return 0; 
    } 
Смежные вопросы