Есть ли эффективный метод, чтобы определить, видны ли какие-либо из вершин MeshGeometryModel3D в области просмотра? - PullRequest
0 голосов
/ 04 сентября 2018

Мне нужно определить, какие треугольники в сетке, внутри заданной двухмерной формы выделения на Viewport3DX видны (игнорируя прозрачность) настолько эффективно, насколько это возможно. Сетка состоит из большого количества треугольников, поэтому крайне неэффективно выполнять лучевое вещание. Есть ли способ сделать это с помощью SharpDX или его оболочки HelixToolkit?

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

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

enter image description here

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

1 Ответ

0 голосов
/ 14 сентября 2018

Общий способ сделать это - преобразовать все вершины в пространство экрана, используя матрицу вида, матрицу проекции и матрицу видового экрана. Затем вы можете легко найти, какие вершины находятся внутри вашей 2D-области. Затем получите все треугольники, связанные с внутренними вершинами.

Конечно, все вершины должны быть пересчитаны после замены камеры.

...