Я делаю программу WPF с возможностью графического изменения данных в 3D.Чтобы дать пользователю возможность выбрать несколько графических объектов одновременно, я хочу реализовать прямоугольник выбора.(Точно так же, как в проводнике Windows.) Общая функция в программах, подобных этой, состоит в том, чтобы иметь 2 разные функции для прямоугольника выбора и чтобы пользователь мог каким-то образом выбирать, какой из методов следует использовать.
- Выбран любой объект, который частично или полностью находится внутри прямоугольника.
- Выбраны только объекты, которые полностью находятся внутри прямоугольника.
2-й метод является прямым, используя ограничивающую рамку каждого объекта, и проверьте, находится ли он внутри прямоугольника.Первый, с другой стороны, кажется довольно сложной работой.Все мои графические объекты представляют собой сложные трехмерные фигуры и могут поворачиваться пользователем любым способом.В настоящий момент я не могу найти какой-либо другой способ, кроме проверки, пересекает ли какой-либо из треугольников в сетке любого из объектов мой 2D-прямоугольник, и это может занять довольно много времени.
У меня мало опыта сWPF 3D, но я делал это раньше в OpenGL.Затем я мог сказать OpenGL нарисовать определенную область экрана и собрать список объектов, которые были видны в определенной области.Все, что мне нужно для получения нужной мне функциональности, было около 5 строк кода.
Наверное, у меня такой вопрос:
- Есть ли способ сделать это с WPF 3D, аналогично подходу OpenGL?
- Если нет, есть ликакой-нибудь другой умный способ найти все объекты (Visual3D) в области просмотра, которая частично находится за 2D-прямоугольником?
Я отказываюсь верить, что я единственный с такой проблемой, поэтому я надеюсь, чтоум может направить меня в правильном направлении.
С уважением, Сверре
Спасибо за ваш ответ!
2D-прямоугольник находится прямо передкамера и бесконечно расширяется вперед.Я хочу получить любой объект, который частично или полностью находится внутри этого усеченного конуса.
Используемая нами камера - это ортогональная или перспективная проекционная камера ( System.Windows.Media.Media3D.ProjectionCamera ),Причина, по которой мы не используем матричную камеру, заключается в том, что мы используем сторонний инструмент, который не поддерживает матричную камеру.Но я уверен, что есть способ получить матрицу и от проекционной камеры, так что, надеюсь, это не проблема.
Теоретически ваше решение звучит так, как нам нужно, но я не уверен, какпродолжать.Есть ли у вас какие-либо ссылки на пример кода или вы можете дать несколько советов о том, как на самом деле это реализовать?
Кстати: поскольку мы работаем с WPF, у нас нет прямого доступа к DirectX.По крайней мере, к этому мы пришли после некоторых исследований.Вы упоминаете об использовании z-буфера, к которому мы не смогли получить доступ через WPF.Если вы знаете способ доступа к z-буферу, это очень ценится!Это не по теме, но мы изо всех сил пытались отключить z-буфер в течение некоторого времени, но отказались от…
С наилучшими пожеланиями, Сверре