我正在尝试实现一个“raypicker”来选择我的项目中的对象。我不完全理解如何实现这一点,但我从概念上理解它应该如何工作。我一直在尝试学习如何做到这一点,但是我发现的大多数教程都超出了我的想象。我当前的代码基于我发现的最新教程之一,here。
经过几个小时的修改,我相信我的光线选择器遇到的问题实际上首先是光线的创建。如果我用无可争议地位于三角形区域内的坐标替换/硬编码我的近/远平面,则选择器会正确识别它。
我的问题是:我的光线创建似乎没有完全考虑到我当前的“相机”或视角,因此相机旋转不会影响我的鼠标所在的位置。我相信要解决这个问题,我需要使用 gluUnProject() 之类的东西,但是每当我使用它时,返回的 x、y、z 坐标都会非常小,
我目前的光线创作是一团糟。我尝试使用其他人最初提出的方法,但似乎我尝试的任何方法都不适用于我的选择器/交叉点功能。
这是我的光线创建的代码:
void oglWidget::mousePressEvent(QMouseEvent *event)
{
QVector3D nearP = QVector3D(event->x()+camX, -event->y()-camY, -1.0);
QVector3D farP = QVector3D(event->x()+camX, -event->y()-camY, 1.0);
int i = -1;
for (int x = 0; x < tileCount; x++)
{
bool rayInter = intersect(nearP, farP, tiles[x]->vertices);
if (rayInter == true)
i = x;
}
if (i != -1)
{
tiles[i]->showSelection();
}
else
{
for (int x = 0; x < tileCount; x++)
tiles[x]->hideSelection();
}
//tiles[0]->showSelection();
}
重复一遍,我曾经加载视口、模型和投影矩阵,并取消投影鼠标坐标,但在 1920x1080 窗口中,我得到的只是每个鼠标事件的 xy 和 z 范围为 -2 到 2 的值,这就是我尝试这种方法的原因,但这种方法不适用于相机旋转和缩放。
我不想做像素颜色拾取,因为谁知道我以后可能需要这种技术,而且我宁愿在我到目前为止付出的努力之后不放弃