У меня есть 3D-сцена с тысячами строк. Я хочу иметь возможность выбирать ВСЕ 3D-линии в районе 10 пикселей курсора мыши (с перспективной проекцией). Я пытался использовать метод, основанный на уникальном цвете. Но мне этот способ не подходит, т.к. я не могу выбрать ВСЕ строки - только ближайшую. Есть ли приемлемое решение моей проблемы? OpenGL или DirectX - не важно.
Трехмерная линия выбора мыши
Ответы (3)
Почему бы просто не вычислить расстояние между этими линиями и рассматриваемой точкой? Это двухмерное вычисление расстояния от линии до точки. Вероятно, вы могли бы реализовать это с помощью скрипта Perl, который вызывает исполняемый файл Python, который вызывает интерпретатор Lua, и все равно выполняет 100 000 из них в секунду.
Это одна из тех проблем с узким зрением, когда все, что у меня есть, — это молоток, а любая проблема выглядит как гвоздь. Вам не обязательно использовать рендеринг для выбора.
В старом OpenGL (‹= 2.1) вы можете использовать режим выбора, чтобы сделать именно это. Используйте gluPickMatrix()
, чтобы выбрать небольшую область вокруг позиции курсора, инициализировать буфер выделения, перейти в режим выделения (glRenderMode(GL_SELECT)
) и перерисовать сцену. Затем вернитесь из режима выбора, и ваш буфер выбора будет содержать полные имена (на самом деле идентификационные номера) всех нарисованных объектов, которые появляются в интересующей вас области. Вам придется немного изменить код отрисовки, чтобы добавлять имена (glPushName(objIndex)
) вокруг каждого объекта, который вы визуализируете.
Это не самое эффективное использование современного графического оборудования, но оно всегда работает.
Ни OpenGL, ни DirectX не сделают за вас эту работу, потому что они только рисуют. Что вы должны сделать, так это спроецировать все линии вашей сцены на экран и проверить, находится ли ближайшая точка к выбранной позиции ближе, чем желаемое максимальное расстояние. Вы можете ускорить это, сохранив линии в некоторой пространственной структуре подразделения (например, в дереве Kd или подобном), чтобы быстро отбросить все те строки, которые определенно не соответствуют вашим критериям.