C++OpenGL用鼠标拖动多个对象

C++ OpenGL dragging multiple objects with mouse

本文关键字:对象 拖动 鼠标 C++OpenGL      更新时间:2023-10-16

只是想知道有人会如何拖动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,你就可以很容易地计算出它占据屏幕的面积。(我把这个计算留给你)

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