Я использую устаревший 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.