2017-04-01 16 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の)オブジェクトを回転]が重複する可能性:ここでは、ウィンドウ上のランダムな場所をクリックするGIFだ

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

:あなたはまた、mxmyを言うためにmouse()のパラメータの名前を変更することができ(http://stackoverflow.com/questions/43117080/opengl-rotate-object) – ITWitch

答えて

1

私はあなたが左クリックにしたい場合は、マウスが

をクリックすると、オブジェクト(2つの三角形と6ポイントの星を)移動したいとその位置が星の中心になっていれば、あなたは物事を複雑にしています。あなたは既にグローバル変数xyとして星の位置を持っています。したがって、mouse()では、それらをマウスの位置に設定するだけです。

0x0は画面左上ですが、左下がOpenGLであるため、ウィンドウの高さをyで引いてください。

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

xyパラメータグローバル変数を影をxmouse()以来とy、あなたは::に接頭辞があります。

+0

ありがとうございました。しかし、星が停止しているときは、画面をクリックしても機能しません。また、色は変わらない。問題がどこにあるのか分かりません。 -.-; –

+0

@BlackJあなたはおそらく何かを見逃しました。 [これは私がテストしたコードで、GIFを作成しました](https://pastebin.com/A7seMnPG) – Vallentin

+0

ああ、解決しました! LEFTとMIDDLEのボタンにglutPostRedisplay()を追加していませんでした。とにかくそんなにありがとう。 –

関連する問題