C++OpenGL用鼠标拖动多个对象
C++ OpenGL dragging multiple objects with mouse
只是想知道有人会如何拖动4个不同的openGL中的对象。我有非常简单的代码来绘制这些对象:
glPushMatrix();
glTranslatef(mouse_x, mouse_y, 0);
glutSolidIcosahedron();
glPopMatrix();
glPushMatrix();
glTranslatef(mouse_x2, mouse_y2, 0);
glutSolidIcosahedron();
glPopMatrix();
glPushMatrix();
glTranslatef(mouse_x3, mouse_y3, 0);
glutSolidIcosahedron();
glPopMatrix();
glPushMatrix();
glTranslatef(mouse_x4, mouse_y4, 0);
glutSolidIcosahedron();
glPopMatrix();
我知道如何移动对象,但我想学习如何拖放这些对象中的任何一个。我一直在研究名称堆栈和选择模式,但它让我非常困惑。我也知道必须要吃一些贪吃的MouseFunc。这只是我困惑的每个形状的选择。
您需要做的第一件事是在单击按钮时捕捉鼠标在屏幕上的位置。有很多方法可以做到这一点,但我相信这超出了这个问题的范围。当你有屏幕X,Y坐标时,你必须检测是否选择了任何对象以及它是哪一个。有两种可能的方法。您可以跟踪每个对象的边界矩形位置(在屏幕空间中),并且测试光标是否在其中任何一个矩形内将非常简单。或者,您可以通过世界空间中的光标位置从眼睛投射光线,并检查该光线和每个对象的交点。
第二种方法更适用于3D图形,但您似乎只使用X坐标和Y坐标,因此不需要担心对象的Z顺序。
在第一种解决方案的情况下,主要问题是:如何知道你的物体在屏幕上有多大。glutSolidIcosahedron()渲染半径为1的对象。要计算它的屏幕半径,你可以使用一些矩阵数学,或者在这种情况下使用简单的三角法。在渲染之前,您需要知道从相机到绘图平面的距离(我相信您使用了一些glTranslatef(0,0,X)。X是你的距离)你还需要知道相机的视角。您可以在投影矩阵中设置它。现在拿一张纸,画一个角度为α的圆锥体,与距离为X的平面相交,知道一个物体的半径为1,你就可以很容易地计算出它占据屏幕的面积。(我把这个计算留给你)
现在,如果您知道屏幕上的半径,只需测试从单击位置到每个对象的距离。如果距离低于半径,则选择该距离。如果不止一个对象通过了这个测试,只需选择其中的第一个。
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- 如何在鼠标挂钩过程中检测拖动
- 如何通过拖动鼠标QT检查按钮?鼠标移动事件
- 如何防止特定的QTreeView分支被拖动?
- 通过拖动边框调整大小时不显示SDL_WINDOWEVENT_SIZE_CHANGED?
- 在 qt 中的绘图中拖动误差线
- 非拖动功能模板参数包的合法使用
- QML在被Mousearea拖动时无法更改项目位置
- 在OpenGL中,如何将鼠标跟随更改为鼠标单击,拖动并移动释放?
- 如何在 Win32 应用中拖动纯色矩形,而不会产生白色闪烁,也不会干扰其他屏幕对象
- 图形项目的QgraphicsScene中的可拖动像素
- Qt - 防止在拖动标题栏时调整窗口大小
- 在内部使用ComboBox拖动ListWidget项目
- 使用C 绘制矩形拖动
- 在 QGraphicsScene 中拖动 QPixmap:如何避免 lambda 参数中不允许'auto'
- 基于鼠标选择Opengl拖动对象
- 鼠标拖动OpenGL/GLUT中的对象
- 使用 C++ 和 OpenGL 拖动三维对象
- C++OpenGL用鼠标拖动多个对象
- MFC拖动对象