2011-04-21 54 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 2011-04-21 18:53:20

+0

這不是你畫的東西的數量。這是一個概念上的事情。 OpenGL是「只是」一個複雜的繪圖API。一旦您將幾何圖形發送到OpenGL就會柵格化並忘記它。 – datenwolf 2011-04-21 19:34:49

+0

我明白了,但我剛剛看到另一段代碼,其中通過單擊鼠標兩次(對於對角)來繪製該人,並且他能夠繪製多個矩形而不使用任何數組或列表,只需要四個全局變量x,y位置。這似乎幾乎是我想要做的。 – Rizwan 2011-04-22 07:49:21

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; 
    } 
相關問題