Я пытаюсь реализовать «Raypicker» для выбора объектов в моем проекте. Я не совсем понимаю, как это реализовать, но концептуально понимаю, как это должно работать. Я пытался узнать, как это сделать, но большинство руководств, которые я нахожу, проходят мимо моей головы. Мой текущий код основан на одном из недавних руководств, которые я нашел здесь.
После нескольких часов исправлений я пришел к выводу, что проблема, с которой я столкнулся с моим raypicker, в первую очередь связана с созданием луча. Если я заменю/жестко запрограммирую свои ближние/дальние плоскости координатой, которая, несомненно, будет находиться в области треугольника, средство выбора идентифицирует ее правильно.
Моя проблема заключается в следующем: создание моего луча, похоже, не полностью учитывает мою текущую камеру или перспективу, поэтому вращение камеры не влияет на то, где находится моя мышь. Я считаю, что для исправления этого мне нужно что-то вроде использования 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();
}
Повторяю. Раньше я загружал окно просмотра, матрицы модели и проекции и отменял проекцию координат мыши, но в окне с разрешением 1920 x 1080 все, что я получаю, это значения в диапазоне от -2 до 2 для xy. & z для каждого события мыши, поэтому я пробую этот метод, но этот метод не работает с вращением и масштабированием камеры.
Я не хочу выбирать цвет пикселей, потому что кто знает, что мне может понадобиться эта техника позже, и я бы не хотел сдаваться после того количества усилий, которые я приложил до сих пор.