在opengl中,如何更改鼠标按下鼠标单击,拖动并移动释放?

时间:2018-04-15 07:19:37

标签: c++ animation opengl glut

我有程序,其中对象(三角形)跟随鼠标移动并旋转到其移动方向。为了使对象保持静止,我需要做什么,直到我点击它,将它拖到一个位置,一旦我松开鼠标,它就开始移动到那个位置?

#include <GL/glut.h>
#include <math.h>
# define ANIMATION_STEP (1000/300)
# define PI 3.1415926535897932

struct Globals {
    centre_x, centre_y, rotate;
    float length;
    float mouse_x, mouse_y, speed;
    int animating;
} globals;

void init(void){
    // Starting position of the triangle
    globals.centre_x = 100;
    globals.centre_y = 100;
    globals.rotate = 0.0;
    globals.mouse_x = 300.0;
    globals.mouse_y = 300.0;
    // Animation speed in pixels per second
    globals.speed = 300.0;
    // size of the triangle
    globals.length = 27;
    globals.animating = 1;
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity(); 
    gluOrtho2D(0.0, 1000.0, 0.0, 700.0);
}

void triangle(void){
    glBegin(GL_POLYGON);
    glVertex2f(0.5, 0.0);
    glVertex2f(-0.5, -0.5);
    glVertex2f(-0.5, 0.5);
    glEnd();
}

void display(void){
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(globals.mouse_x, globals.mouse_y, 0.0);
    glRotatef(globals.rotate, 0.0, 0.0, 1.0);
    glScalef(globals.length, globals.length, 1.0);
    triangle();
    glFlush();
    glutSwapBuffers();
}

float limit(float x, float min, float max){
    if (x < min) {
        x = min;
    }
    if (x > max) {
        x = max;
    }
    return x;
    }

void timer(int v){
    // Computing elapsed time for smooth animation.
    int time = glutGet(GLUT_ELAPSED_TIME);
    float angle;
    glutTimerFunc(ANIMATION_STEP, timer, time);
    if (globals.animating) {
        int delta_t = time - v;
        float delta_x, delta_y, length, step_size;
        // Compute vector from current location to mouse
        delta_x = globals.mouse_x - globals.centre_x;
        delta_y = globals.mouse_y - globals.centre_y;
        // Compute length of the vector
        length = sqrt (delta_x*delta_x + delta_y*delta_y);
        // If the triangle is close to the mouse, then no motion is required.
        step_size = globals.speed * delta_t / 1000.0;
            if (length > step_size * 0.55) {
            delta_x = delta_x / length;
            delta_y = delta_y / length;
            globals.centre_x += delta_x * step_size;
            globals.centre_y += delta_y * step_size;
            angle = atan2(delta_y, delta_x);
            globals.rotate = angle * 180.0 / PI;
            // Keep the triangle inside the world window.
            globals.centre_x = limit(globals.centre_x, 0.0 + globals.length/2, 1000.0 - globals.length/2);
            globals.centre_y = limit(globals.centre_y, 0.0 + globals.length/2, 700.0 - globals.length/2);
        }

        glutPostRedisplay();
    }
}

void mousemotion(int x, int yc){
    globals.mouse_x = x;
    globals.mouse_y = 700 - yc;
    glutPostRedisplay();
}

main(int argc, char** argv){
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(1000, 700);
    glutInitWindowPosition(10, 10);
    glutDisplayFunc(display);
    glutTimerFunc(ANIMATION_STEP, timer, 0);
    glutPassiveMotionFunc(mousemotion);
    init();
    glutMainLoop();
    return 0;
}

我调查了processMouse(),如果state == GLUT_DOWN那么它会记录当前位置并且鼠标按下坐标,但最好的我能够得到的是它立即传送到鼠标点击。有人可以解释我需要做什么来点击它,拖动,释放,然后移动到位置?

1 个答案:

答案 0 :(得分:-1)

  

在opengl中,如何更改鼠标......

你没有。 OpenGL中不存在鼠标。也许您应该将问题更改为“如何在Windows / GLUT / SDL /无框架中处理鼠标事件?”其中有几十个重复。