Получить список всех Point3D в Viewport3D в WPF
Есть ли простой способ вернуть список всех Point3D, присутствующих в объекте Viewport3D в WPF? Мне нужна эта коллекция, чтобы определить границы XYZ, чтобы я мог расположить камеру так, чтобы все Point3D находились в поле зрения.
Если не существует простого метода, какие коллекции мне нужно было бы перебрать, чтобы обеспечить захват всех Point3D?
1 ответ
Существует очень длинная иерархия, которую мы должны пересечь, чтобы получить нужные данные.
Viewport3D.Children
возвращаетVisual3DCollection
объект, который содержит наборVisual3D
Visual3D
имеет 3 детских класса; мы заинтересованы вModelVisual3D
ModelVisual3D.Children
возвращает другойVisual3DCollection
; Вы можете ясно увидеть рекурсивную древовидную структуру сViewport3D
в корнеModelVisual3D.Visual3DModel
возвращаетModel3D
объектModel3D
имеет 3 детских класса; мы заинтересованы вGeometryModel3D
а такжеModel3DGroup
Model3DGroup.Children
это еще один списокModel3D
; следовательно, у нас есть два слоя рекурсивного сдерживанияGeometry3D.Geometry
возвращаетGeometry3D
объектGeometry3D
Любопытно, что есть только один дочерний классMeshGeometry3D
MeshGeometry3D.Positions
наконец дает сырой список точек
Обратите внимание, что эти точки находятся в локальной основе этого Geometry3D
объект. Чтобы получить мировые координаты, при прохождении иерархии необходимо накапливать список преобразований любого Model3D
объекты, с которыми вы сталкиваетесь, и умножьте их на точки в конце.
Model3D.Transform
возвращаетTransform3D
объектTransform3D
имеет 3 детских класса -AffineTransform3D
,MatrixTransform3D
а такжеTransform3DGroup
; но на этот раз нам не нужно их рассматриватьTransform3D.Transform(Point3D)
довольно понятно- Я не вижу оператора умножения между двумя
Transform3D
классы (кромеMatrixTransform3D
), так что для каждогоPoint3D
Вы должны пройти список преобразований в обратном порядке и для каждого элемента использовать вывод из предыдущего
Вышесказанное суммирует, почему почти никто не использует WPF для разработки 3D; но это должно быть зарезервировано для http://linux.stackexchange.com/.