WPF: поиск 3D-визуалов, которые частично находятся внутри 2D-прямоугольника - PullRequest
6 голосов
/ 27 апреля 2011

Я делаю программу WPF с возможностью графического изменения данных в 3D.Чтобы дать пользователю возможность выбрать несколько графических объектов одновременно, я хочу реализовать прямоугольник выбора.(Точно так же, как в проводнике Windows.) Общая функция в программах, подобных этой, состоит в том, чтобы иметь 2 разные функции для прямоугольника выбора и чтобы пользователь мог каким-то образом выбирать, какой из методов следует использовать.

  1. Выбран любой объект, который частично или полностью находится внутри прямоугольника.
  2. Выбраны только объекты, которые полностью находятся внутри прямоугольника.

2-й метод является прямым, используя ограничивающую рамку каждого объекта, и проверьте, находится ли он внутри прямоугольника.Первый, с другой стороны, кажется довольно сложной работой.Все мои графические объекты представляют собой сложные трехмерные фигуры и могут поворачиваться пользователем любым способом.В настоящий момент я не могу найти какой-либо другой способ, кроме проверки, пересекает ли какой-либо из треугольников в сетке любого из объектов мой 2D-прямоугольник, и это может занять довольно много времени.

У меня мало опыта сWPF 3D, но я делал это раньше в OpenGL.Затем я мог сказать OpenGL нарисовать определенную область экрана и собрать список объектов, которые были видны в определенной области.Все, что мне нужно для получения нужной мне функциональности, было около 5 строк кода.

Наверное, у меня такой вопрос:

  1. Есть ли способ сделать это с WPF 3D, аналогично подходу OpenGL?
  2. Если нет, есть ликакой-нибудь другой умный способ найти все объекты (Visual3D) в области просмотра, которая частично находится за 2D-прямоугольником?

Я отказываюсь верить, что я единственный с такой проблемой, поэтому я надеюсь, чтоум может направить меня в правильном направлении.

С уважением, Сверре


Спасибо за ваш ответ!

2D-прямоугольник находится прямо передкамера и бесконечно расширяется вперед.Я хочу получить любой объект, который частично или полностью находится внутри этого усеченного конуса.

Используемая нами камера - это ортогональная или перспективная проекционная камера ( System.Windows.Media.Media3D.ProjectionCamera ),Причина, по которой мы не используем матричную камеру, заключается в том, что мы используем сторонний инструмент, который не поддерживает матричную камеру.Но я уверен, что есть способ получить матрицу и от проекционной камеры, так что, надеюсь, это не проблема.

Теоретически ваше решение звучит так, как нам нужно, но я не уверен, какпродолжать.Есть ли у вас какие-либо ссылки на пример кода или вы можете дать несколько советов о том, как на самом деле это реализовать?

Кстати: поскольку мы работаем с WPF, у нас нет прямого доступа к DirectX.По крайней мере, к этому мы пришли после некоторых исследований.Вы упоминаете об использовании z-буфера, к которому мы не смогли получить доступ через WPF.Если вы знаете способ доступа к z-буферу, это очень ценится!Это не по теме, но мы изо всех сил пытались отключить z-буфер в течение некоторого времени, но отказались от…

С наилучшими пожеланиями, Сверре

Ответы [ 2 ]

1 голос
/ 27 апреля 2011

Является ли ваша область пересечения двумерным прямоугольником или усечением, основанным на двумерном прямоугольнике и простирающимся бесконечно вперед (или, возможно, до некоторого предела отсечения)? Если это может быть истолковано как упрощение просмотра, то вы можете использовать существующие возможности графической системы для рендеринга сцены, используя вид и проекцию камеры, которые соответствуют исходному прямоугольнику, с отключенным освещением и затенением, и цветами, выбранными специально для ' пометьте различные объекты в вашей сцене. Это означает, что вы можете использовать графическое оборудование для выполнения отсечения / проекции в качестве операции «рендеринга», а затем просто перечислить значения пикселей в виде «тегов», чтобы определить объекты, присутствующие в прямоугольном представлении.

Если вам нужно ограничить выделение фактическим 2-мерным срезом (или очень мелким усечением), вы можете использовать Z-буфер (если вы можете получить к нему доступ), чтобы исключить помеченные пиксели, которые находятся за пределами диапазона Z вашего желаемая подборка.

Приятной особенностью этого подхода является то, что у вас, вероятно, уже есть матрица камеры (это та же матрица, которая используется для вашего окна для выбора), и вам нужно всего лишь изменить матрицу проекции, чтобы она была подмножеством окна просмотра.

0 голосов
/ 03 октября 2011

«Умным» способом было бы преобразовать прямоугольник в прямоугольник, используя матрицу камеры

А затем сделайте пересечение всех объектов и коробки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...