Получить список всех 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/.

Другие вопросы по тегам