in opengl, how to change mouse follow to mouse click, drag and move on release?

扶醉桌前 提交于 2019-12-13 03:33:12

问题


I have program in which the object (a triangle) follows the mouse as it moves around and rotates to the direction its moving. What do I have to do to make it so the object stays still, until I click it, drag it to a position and once I release the mouse, it starts to move to that position?

#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;
}

I have investigated processMouse() where if state == GLUT_DOWN then it records the current position and mouse press cordinates, but the best ive been able to get is that it immediately teleports to the mouse click. Can someone please explain what I would need to do to click on it, drag, release, then move to position?


回答1:


in opengl, how to change mouse...

You don't. Mouse does not exist in OpenGL. Maybe you should change the question to "How to process mouse events in windows/GLUT/SDL/whatever-framework?" for which there are dozens of duplicates.



来源:https://stackoverflow.com/questions/49839428/in-opengl-how-to-change-mouse-follow-to-mouse-click-drag-and-move-on-release

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!