'Ray' 光线拾取的创建未完全正常工作

'Ray' creation for raypicking not fully working

我正在尝试实施 'raypicker' 以在我的项目中选择对象。我不完全理解如何实现这一点,但我从概念上理解它应该如何工作。我一直在努力学习如何做到这一点,但我发现大多数教程都让我难以理解。我当前的代码基于我发现的最近的教程之一,here.

经过几个小时的修改,我相信我的 raypicker 遇到的问题实际上首先是光线的创建。如果我 substitute/hardcode 我的 near/far 平面的坐标毫无疑问位于三角形区域内,则选择器会正确识别它。

我的问题是:我的光线创建似乎没有完全考虑我当前的“相机”或视角,所以相机旋转不会影响我的鼠标位置是。 我相信要解决这个问题,我需要使用 gluUnProject() 之类的东西,但是每当我使用它时,返回的 x、y、z 坐标都会非常小,

我目前的光线创作一团糟。我尝试使用其他人最初提出的方法,但似乎我尝试过的任何方法都无法与我的 picker/intersection 函数一起使用。

这是我创建光线的代码:

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 window 内,我得到的只是对于每个鼠标事件,x y 和 z 的值在 -2 到 2 的范围内,这就是我尝试这种方法的原因,但这种方法不适用于相机旋转和缩放。

我不想做像素取色,因为谁知道我以后可能会用到这个技术,我宁愿在付出了这么多努力之后也不会放弃

看看

http://www.realtimerendering.com/intersections.html

在确定各种几何图形之间的交点方面有很多帮助

http://geomalgorithms.com/code.html 也有一些 C++ 函数,其中之一可以满足您的需求

由于您在构建射线时似乎遇到了问题,因此我将采用以下方法。这个没有直接测试过。你可以这样做,确保所有向量都在同一个 space 中。如果您使用多个模型矩阵(或其堆栈),则需要对每个模型矩阵分别重复计算。

  1. 使用pos = gluUnproject(winx, winy, near, ...)获取鼠标坐标在模型中近平面的位置space; nearglFrustum()gluPerspective()
  2. 的值
  3. 光线的起点是模型中的相机位置space:rayorig = inv(modelmat) * camera_in_worldspace
  4. 射线的方向是从1.的位置到射线原点的归一化向量:raydir = normalize(pos - rayorig)

在链接的网站上,他们使用两个点作为光线,而且他们似乎没有标准化光线方向矢量,所以这是可选的。

好的,这就是我的面包屑路径的开始。

不知何故,我对矩阵的 QT 数据类型以及与矩阵转换有关的逻辑有疑问。

这个问题中的这个特殊问题是由于实际上没有执行任何转换造成的。

解决这个问题的步骤是:

  • 将鼠标坐标转换成NDCspace(-1到1范围内:x/screenwidth * 2 - 1,y - height / height * 2 - 1)
  • 为我的视图矩阵抓取4x4矩阵(可以是渲染时使用的,也可以重新计算)
  • 在一个新向量中,让它等于逆视图矩阵乘以逆投影矩阵。

为了构建光线,我必须执行以下操作:

  • 对相乘的矩阵取之前计算的值。这将乘以向量 4(4 个点的数组),其中它将保存先前计算的 x 和 y 坐标,以及 -1,然后是 +1.
  • 然后这个向量将除以整个向量的最后一个点值
  • 创建另一个向量 4,就像上一个一样,但不是 -1,而是 "1" .
  • 再次将其除以其最后的现货值。

现在光线的坐标已在远平面和近平面创建,因此它可以与场景中沿着它的任何东西相交。

我开了一系列问题(因为我的一系列问题有很大的不确定性),所以我的部分问题也在其中重叠。

  • ,我了解到我需要考虑屏幕高度来切换笛卡尔系统的 y 轴原点,因为 windows 的 y 轴从顶部开始左边。此外,检索矩阵是多余的,但也是错误的,因为它们从未被“正确”声明。
  • ,我了解到 unProject 不起作用,因为我试图使用 OpenGL 函数拉模型和查看矩阵,但我从来没有真正设置它们,因为我构建了矩阵用手。我分两次解决了这个问题:我手动进行了数学运算,并制作了相同数据类型的所有矩阵(它们之前是混合数据类型,也导致了问题)。
  • And lastly, in here,我了解到我的操作顺序有点不对(需要将矩阵乘以向量,而不是相反),我的近平面需要是-1,而不是0,而且与矩阵相乘的向量的最后一个值(值“w”)需要为 1。

感谢帮助我解决这些问题的人: