Можно ли выделить несколько объектов с помощью поля выбора? - PullRequest
1 голос
/ 05 мая 2020

Я знаю, что с помощью QObjectPicker я могу выбрать мышкой отдельный объект. Но как выбрать несколько объектов, нарисовав прямоугольник на экране?

1 Ответ

1 голос
/ 06 мая 2020

Я думаю, что это на самом деле довольно сложно. Но вот мои два цента:


Если вам нужно только иметь возможность выбирать незаключенные объекты

(т.е. не нужно выбирать закрытые) вы можете добавить вторую ветвь графа кадра к существующей и нарисовать каждый объект уникальным цветом, но с текстурой вне экрана. Затем извлеките эту текстуру, проверьте, какие цвета l ie внутри нарисованного прямоугольника, извлеките соответствующие объекты и выберите их (сравните с этим вопросом / ответом ).

Я не уверен насколько хорошо это работает в Qt3D, потому что у меня всегда были проблемы с QRenderCapture. Кажется, это не повлияло на то, где я добавил его в граф кадра, то есть всегда фиксировал последнее состояние, поэтому, возможно, даже если у вас есть несколько целей рендеринга, он может захватить неправильный et c. Qt3D все еще находится в довольно грубом состоянии.

Если вам нужен пример рендеринга внеэкранной текстуры, посмотрите мой пример на GitHub .


Если вам нужно иметь возможность выбирать и закрытые объекты

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

Если у вас не так много объектов, возможно, вы могли бы реализовать идею сверху для каждого отдельного объекта. Т.е. для каждого объекта у вас есть закадровая ветвь графа кадра, которая фильтрует все остальные объекты. Затем вы можете проверить каждую визуализированную текстуру на прямоугольник, нарисованный с помощью мыши. Но опять же, я не уверен, насколько хорошо это работает с Qt3D, и если у вас много объектов (например, в игре), он, вероятно, треснет sh из-за множества закадровых текстур.

Вы также можете что-то реализовать как выбраковка "обратной" усеченной кости. При отсечении усеченного конуса вы пропускаете рендеринг объектов, которые l ie находятся за пределами усеченного конуса обзора камеры. Вы можете вычислить усеченную пирамиду, используя координаты прямоугольника, нарисованные с помощью мыши. Обратите внимание на QFrustumCulling код . Конечно, вам нужно будет вычислять плоскости по-другому, используя модифицированную матрицу вида. Когда пользователь нарисовал aws прямоугольник, вычислите усеченную пирамиду и проверьте все объекты. К сожалению, при этом также выбираются объекты, ограничивающая сфера которых пересекается с усеченной пирамидой, даже если вы можете видеть, не касаясь какой-либо части объекта. Если это вас беспокоит, вы можете напрямую выбрать все объекты, сфера которых полностью находится внутри усеченной пирамиды, и для всех объектов, которые пересекаются только частично, выполнить вычисление пересечения для каждого треугольника и выйти из вычисления для текущего объекта, как только треугольник пересечет треугольник. усеченный. В зависимости от количества треугольников это может быть очень затратным с точки зрения вычислений. дн.

...