OpenGL перемещение вершин с помощью мыши

Я использую устаревший OpenGL и пытаюсь перемещать вершины с помощью мыши. Чтобы проверить, нажата ли вершина, я перебираю все вершины и умножаю их на модель и матрицу проекции перед делением на значение w. Это прекрасно работает и показано ниже:

for (Vertex *vertex : context->getMesh().vertices) {
        QVector4D vert(vertex->xPos, vertex->yPos, vertex->zPos, 1.0f);
        QVector4D transformedVert = projectionMatrix * modelMatrix * vert;
        transformedVert /= transformedVert.w();
        if ((mappedX < (transformedVert.x() + 0.1) && mappedX > (transformedVert.x() - 0.1)) &&
            (mappedY < (transformedVert.y() + 0.1) && mappedY > (transformedVert.y() - 0.1))) {
            std::cout << "SUCCESS" << std::endl;
            vertexPicked = true;
            currentVertex = vertex;
        }
    }

Затем, когда я перемещаю мышь, я пытаюсь работать в обратном направлении, сначала умножая текущие координаты мыши на то же значение W, что и на первом шаге, а затем умножая на обратную матрицу проекции и модели. Это перемещает вершину, но не туда, где находится мышь.

  float mouseX = ((2.0f * event->x()) / width() - 1.0f);
  float mouseY = -((2.0f * event->y()) / height() - 1.0f);
  float x = (modelMatrix.inverted() * projectionMatrix.inverted() *
                (QVector4D(mouseX, mouseY, 1, 1) * (projectionMatrix * modelMatrix * QVector4D(MousePicker::currentVertex->xPos, MousePicker::currentVertex->yPos, MousePicker::currentVertex->zPos, 1)).w())).x();

  MousePicker::currentVertex->xPos = x;

В настоящее время я только пытаюсь изменить координату X.


person Callum Perks    schedule 31.01.2019    source источник
comment
Снова вам нужно разделить на w. Выполняется компонентом w, после преобразования видом обратной модели и матрицей проекции (конечно же, компонентом w, который является результатом преобразования обратных матриц).   -  person Rabbid76    schedule 31.01.2019
comment
@ Rabbid76 Я пробовал это, и это не дало никакого эффекта. Должен ли я умножаться на компонент w, прежде чем я умножу на обратные матрицы?   -  person Callum Perks    schedule 31.01.2019
comment
Нет. Координата, которая преобразуется матрицей обратной проекции, должна быть нормализованной координатой устройства (все компоненты в диапазоне [-1, 1]).   -  person Rabbid76    schedule 31.01.2019
comment
Это новый код:   -  person Callum Perks    schedule 31.01.2019
comment
@ Rabbid76 Я это сделал. Теперь я умножаю координаты мыши на обратные матрицы и делю на компонент w. Вершины движутся дальше, чем указатель мыши   -  person Callum Perks    schedule 31.01.2019
comment
У вас есть перспективная проекция. Вы должны знать глубину координаты вершины! QVector4D(mouseX, mouseY, 1, 1) - это точка на дальней плоскости, но не координата вершины в нормализованном пространстве устройства. Нормализованная координата z пространства устройства также важна, потому что при перспективной проекции координаты x и y пространства обзора зависят от глубины.   -  person Rabbid76    schedule 31.01.2019