在opengl中,如何将鼠标跟随更改为鼠标单击、拖动和释放?

Posted

技术标签:

【中文标题】在opengl中,如何将鼠标跟随更改为鼠标单击、拖动和释放?【英文标题】:in opengl, how to change mouse follow to mouse click, drag and move on release? 【发布时间】:2018-04-15 07:19:36 【问题描述】:

我有一个程序,其中对象(三角形)在鼠标移动时跟随鼠标并旋转到它移动的方向。我该怎么做才能使对象保持静止,直到我单击它,将其拖动到一个位置,一旦我松开鼠标,它就开始移动到该位置?

#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,它会记录当前位置和鼠标按下坐标,但我能得到的最好的结果是它立即传送到鼠标点击。有人可以解释一下我需要做什么才能点击它、拖动、释放,然后移动到位置?

【问题讨论】:

见 simple low level Drag&Drop example in C++ 只需根据您的需要进行调整。 @Spektre 这对我没有任何帮助。它可能是 C++,但对我来说根本不是那样。我不能只是调整它,因为我什至不知道我在看什么。我感谢您的帮助,并且认为它不是 C++ 可能是错误的,但即使是,它对我来说也没有意义 这是关于如何完成 拖放 样式编辑器的简单且带注释的示例...在我看来,您要做什么(对于单个对象而不是list) 所以唯一的区别是你有一个对象并使用 OpenGL 而不是 GDI 进行渲染。因此,吸收该示例的体系结构并将其合并到您的代码中。例如viewerview 矩阵,它与您的ModelView 倒数您的三角形是Atom 类等... How to create a rubber-esque drag and move of 2D object in c++ glut的可能重复 【参考方案1】:

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

你没有。鼠标在 OpenGL 中不存在。也许您应该将问题更改为“如何在 windows/GLUT/SDL/whatever-framework 中处理鼠标事件?”有几十个重复项。

【讨论】:

以上是关于在opengl中,如何将鼠标跟随更改为鼠标单击、拖动和释放?的主要内容,如果未能解决你的问题,请参考以下文章

将 jqueryui 手风琴事件处理程序从“单击”动态更改为“鼠标悬停”

OpenGL / GLUT中的鼠标拖动对象[关闭]

电脑应用拖到上边放大

在flash如何制作一个的鼠标跟随特效

用鼠标单击 OpenGL 拖动 3d 对象

单击鼠标时如何跟随本机