2017-04-01 3 views
0

마우스 클릭으로 물체 (2 개의 삼각형이있는 6 점 별)를 이동하고 싶습니다. 다음 코드를 작성했지만 응답이 없습니다. 케이스 GLUT_LEFT_BUTTON에서 마우스 클릭으로 움직이는 물체

case GLUT_LEFT_BUTTON: 
    if (state == GLUT_DOWN) { 
     float x_min = (-x + 500)/500; 
     float x_max = (x - 500)/500; 
     float y_min = (-y + 500)/500; 
     float y_max = (y - 500)/500; 
     gluOrtho2D(x_min, x_max, y_min, y_max); 
    } 
glutPostRedisplay(); 
break; 

, 나는 최소/maxmimum x와 y 위치를 넣어하지만 아무것도 내가 마우스 왼쪽 버튼을 클릭하면 작동하지 않습니다. 여기

전체 코드입니다 :

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

float v1[3] = { -35.0f, 22.5f, 0.0f }; 
float v2[3] = { -35.0f, -22.5f, 0.0f }; 
float v3[3] = { 0.0f, 42.5f, 0.0f }; 
float v4[3] = { 0.0f, -42.5f, 0.0f }; 
float v5[3] = { 35.0f, 22.5f, 0.0f }; 
float v6[3] = { 35.0f, -22.5f, 0.0f }; 

static GLfloat spin = 0.0; 

float x = 400.0f, y = 442.5f; 
float x_position; 
float y_position; 

float color1[3] = { 1.0f, 1.0f, 1.0f }; 
float color2[3] = { 1.0f, 1.0f, 1.0f }; 

int mode = 1; 
int rotate = 1; 

void init(void); 
void triangle_1(void); 
void triangle_2(void); 
void display(void); 
void spinDisplay_1(void); 
void spinDisplay_2(void); 
void reshape(int, int); 
void changeColor(int); 
void mouse(int, int, int, int); 

//////////////////////////////////////////////////////////////////// 

int main(int argc, char **argv) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); 
    glutInitWindowSize(500, 500); 
    glutInitWindowPosition(300, 300); 
    glutCreateWindow("6-Point Star"); 

    init(); 

    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 
    glutMouseFunc(mouse); 
    glutMainLoop(); 

    return 0; 
} 

//////////////////////////////////////////////////////////////////// 

void init(void) { 
    glClearColor(0.0, 0.0, 0.0, 0.0); 
    glShadeModel(GL_FLAT); 
} 

void triangle_1(void) {   //// triangle_1 and triangle_2 make 6-point star //// 
    glColor3fv(color1); 

    glBegin(GL_TRIANGLE_FAN); 
    glVertex3fv(v1); 
    glVertex3fv(v4); 
    glVertex3fv(v5); 

    glEnd(); 
} 

void triangle_2(void) { 
    glColor3fv(color2); 

    glBegin(GL_TRIANGLE_FAN); 
    glVertex3fv(v2); 
    glVertex3fv(v3); 
    glVertex3fv(v6); 

    glEnd(); 
} 

void display(void) { 
    glClear(GL_COLOR_BUFFER_BIT); 
    glPushMatrix(); 

    glTranslatef(x, y, 0.0f); 
    glRotatef(spin, 0.0, 0.0, 1.0); 

    triangle_1(); 
    triangle_2(); 

    glPopMatrix(); 

    glutSwapBuffers(); 
} 

void spinDisplay_1(void) { 
    spin = spin + 2.0; 

    if (spin > 360.0) { 
     spin = spin - 360.0; 
    } 

    glutPostRedisplay(); 
} 

void spinDisplay_2(void) { 
    spin = spin - 2.0; 

    if (spin < 360.0) { 
     spin = spin + 360.0; 
    } 

    glutPostRedisplay(); 
} 

void reshape(int w, int h) { 
    glViewport(0, 0, (GLsizei)w, (GLsizei)h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0.0, 500.0, 0.0, 500.0); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 

void changeColor(int n) { 
    if (n == 1) { 
     color1[0] = 0.0f, color1[1] = 0.0f, color1[2] = 1.0f; 
     color2[0] = 0.0f, color2[1] = 1.0f, color2[2] = 0.0f; 
    } 
    else if (n == 2) { 
     color1[0] = 1.0f, color1[1] = 1.0f, color1[2] = 1.0f; 
     color2[0] = 1.0f, color2[1] = 1.0f, color2[2] = 1.0f; 
    } 
} 

void mouse(int button, int state, int x, int y) {   /////// mouse event //////// 
    switch (button) { 
    case GLUT_LEFT_BUTTON: 
     if (state == GLUT_DOWN) { 
      float x_min = (-x + 500)/500; 
      float x_max = (x - 500)/500; 
      float y_min = (-y + 500)/500; 
      float y_max = (y - 500)/500; 
      gluOrtho2D(x_min, x_max, y_min, y_max); 
     } 
     glutPostRedisplay(); 
     break; 
    case GLUT_MIDDLE_BUTTON: 
     if (state == GLUT_DOWN) { 
      if (mode == 1) { 
       changeColor(mode); 
       mode = 2; 
      } 
      else if (mode == 2) { 
       changeColor(mode); 
       mode = 1; 
      } 
     } 
     break; 
    case GLUT_RIGHT_BUTTON: 
     if (state == GLUT_DOWN) 
      if (rotate == 1) { 
       glutIdleFunc(spinDisplay_1); 
       rotate = 2; 
      } 
      else if (rotate == 2) { 
       glutIdleFunc(spinDisplay_2); 
       rotate = 1; 
      } 
     break; 
    default: 
     break; 
    } 
} 
+2

가능한 복제 [(OpenGL을) 객체 회전] (http://stackoverflow.com/questions/43117080/opengl-rotate-object) – ITWitch

답변

1

난 당신이 클릭 왼쪽하려면 마우스

을 클릭하여 (2 개 삼각형 6 점 별) 객체를 이동하려는 및 그 위치가 이제 별의 중심이되면, 당신은 물건을 지나치게 복제하고 있습니다. 별의 위치는 이미 전역 변수 xy입니다. 따라서 에서 마우스 위치로 설정하면됩니다.

그러나 0x0은 화면 왼쪽 상단이지만 OpenGL에서는 왼쪽 아래에 있기 때문에 창 높이를 y까지 뺍니다.

if (state == GLUT_DOWN) { 
    ::x = x; 
    ::y = glutGet(GLUT_WINDOW_HEIGHT) - y; 
} 

xy 매개 변수를 글로벌 변수를 그림자를 xmouse() 이후 및 y, 당신은 ::와 접두사해야합니다. 또한 mxmy 말을 mouse()의 매개 변수의 이름을 바꿀 수 있습니다 : 여기

void mouse(int button, int state, int mx, int my) { 
    [...] 
    if (state == GLUT_DOWN) { 
     x = mx; 
     y = glutGet(GLUT_WINDOW_HEIGHT) - my; 
    } 

창에서 임의의 장소를 클릭하는 GIF의 :

이의
+0

감사합니다. 그러나 별이 멈 추면 화면을 클릭해도 작동하지 않습니다. 또한 색상이 변경되지 않습니다. 나는 문제가 어디 있는지 알 수 없다. -.-; –

+0

@BlackJ 아마도 방금 뭔가를 놓쳤을 것입니다. [이것은 테스트 한 코드이며 GIF를 만들었습니다.] (https://pastebin.com/A7seMnPG) – Vallentin

+0

오, 해결했습니다! LEFT 및 MIDDLE 버튼에 glutPostRedisplay()를 추가하지 않았습니다. 어쨌든 고맙습니다. –

관련 문제