2011-04-21 53 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

1つの正方形についても? – Rizwan

+0

あなたが作ったものの量ではありません。これは概念的なことです。 OpenGLは洗練された描画APIです。ジオメトリをOpenGLに送信すると、それをラスタライズして忘れてしまいます。 – datenwolf

+0

私は理解していますが、マウスを2回クリックして描画していた別のコードを見ただけで、配列やリストを使わずに複数の矩形を描くことができました。 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; 
    } 
関連する問題