【问题标题】:C++ OpenGL dragging multiple objects with mouseC++ OpenGL用鼠标拖动多个对象
【发布时间】:2014-09-16 05:40:23
【问题描述】:

只是想知道有人会如何拖动 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();

我了解如何移动对象,但我想了解如何拖放这些对象中的任何一个。 我一直在研究名称堆栈和选择模式,但它只是把我弄糊涂了。 而且我也知道必须有某种 glutMouseFunc。 这只是我困惑的每个形状的选择。

【问题讨论】:

    标签: c++ opengl glut glew freeglut


    【解决方案1】:

    您需要做的第一件事是在单击按钮时捕获鼠标在屏幕上的位置。有很多方法可以做到这一点,但我相信这超出了这个问题的范围。当您拥有屏幕 X、Y 坐标时,您必须检测是否选择了任何对象以及它是哪一个。有两种可能的方法。您可以跟踪每个对象的边界矩形位置(在屏幕空间中),并且如果光标在这些矩形中的任何一个内,测试将非常简单。或者,您可以通过世界空间中的光标位置从眼睛投射光线,并检查该光线与每个对象的交点。

    第二种方法更适用于 3D 图形,但您似乎只使用 X 和 Y 坐标,因此您无需担心对象的 Z 顺序。

    在第一个解决方案的情况下,主要问题是:如何知道您的对象在屏幕上有多大。 glutSolidIcosahedron() 渲染半径为 1 的对象。要计算它的屏幕半径,您可以使用一些矩阵数学,或者在这种情况下使用简单的三角函数。您将需要知道从相机到绘图平面的距离(我相信您在渲染之前使用了一些 glTranslatef(0,0,X)。X 是您的距离)您还需要知道相机的视角。您将其设置在投影矩阵中。现在拿一张纸,画一个角度为 alpha 的圆锥,与距离 X 的平面相交,并且知道一个对象的半径为 1,您可以轻松计算出它占据的屏幕面积有多大。 (这个计算留给你)

    现在,如果您知道屏幕上的半径,只需测试从您的点击位置到每个对象的距离。如果距离低于半径,则它被选中。如果不止一个对象通过了此测试,只需选择其中的第一个即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多