只是想知道有人会如何拖动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。 它只是我迷惑的每种形状的选择。
答案 0 :(得分:1)
您需要做的第一件事是在单击按钮时捕获鼠标在屏幕上的位置。有很多方法可以做到这一点,但我相信它超出了这个问题的范围。当您有屏幕X,Y坐标时,您必须检测是否选择了任何对象以及它是哪一个。有两种可能的方法。您可以跟踪每个对象的边界矩形位置(在屏幕空间中),如果光标位于任何这些矩形内,测试将非常简单。或者,您可以从眼睛投射光线到世界空间中的光标位置,并检查此光线与每个对象的交叉点。
第二种方法对于3D图形更加通用,但您似乎只使用X和Y坐标,因此您不必担心物体的Z顺序。
如果是第一个解决方案,主要问题是:如何知道屏幕上的对象有多大。 glutSolidIcosahedron()渲染半径为1的对象。要计算它的屏幕半径,您可以使用一些矩阵数学,或者在这种情况下使用简单的三角函数。你需要知道从摄像机到绘图平面的距离(我相信你在渲染之前使用了一些glTranslatef(0,0,X).X是你的距离)你还需要知道视角。相机。你在投影矩阵中设置它。现在拿一张纸,绘制一个角度为α的锥体,与距离为X的平面相交,并且知道物体的半径为1,您可以轻松计算出它占据的屏幕面积。 (我将把这个计算留给你)
现在,如果您知道屏幕上的半径,只需测试点击位置到每个对象的距离。如果距离低于半径,则选择它。如果多个对象通过此测试,则只需选择其中一个。