在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 进行渲染。因此,吸收该示例的体系结构并将其合并到您的代码中。例如viewer
是view
矩阵,它与您的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中,如何将鼠标跟随更改为鼠标单击、拖动和释放?的主要内容,如果未能解决你的问题,请参考以下文章