2017-08-02 59 views
-1

是否有一种简单方法可以返回WPF中Viewport3D对象中存在的所有Point3D的列表?为了确定XYZ边界,我需要这个集合,以便我可以定位相机,使得所有Point3D都在视野内。获取WPF中Viewport3D中所有Point3D的列表

如果没有简单的方法,我需要迭代哪些集合以确保捕获所有Point3D?

回答

0

我们需要遍历一个非常漫长的层次结构来获取所需的数据。

  • Viewport3D.Children返回Visual3DCollection对象含有一组Visual3D

  • Visual3D具有3个类;我们有兴趣ModelVisual3D

  • ModelVisual3D.Children返回另一个Visual3DCollection;你可以清楚地看到递归树结构Viewport3D在根

  • ModelVisual3D.Visual3DModel返回Model3D对象

  • Model3D有3个类;我们感兴趣的是GeometryModel3DModel3DGroup

  • Model3DGroup.ChildrenModel3D的另一个列表;因此,我们必须递归遏制两层

  • Geometry3D.Geometry返回Geometry3D对象

  • Geometry3D好奇地只有一个子类MeshGeometry3D

  • MeshGeometry3D.Positions最终给出点的原始列表


请注意,这些点是在本地基础上的这Geometry3D对象。为了获得世界坐标,当您遍历层次结构时,您必须累积您遇到的任何对象的变换列表,并乘以最后的点。

  • Model3D.Transform返回Transform3D对象
  • Transform3D具有3个类 - AffineTransform3DMatrixTransform3DTransform3DGroup;但这个时候,我们就不用再考虑这些
  • Transform3D.Transform(Point3D)是非常自我解释
  • 我没有看到一个乘法运算符将两个Transform3D类之间(除MatrixTransform3D),因此每个Point3D你必须遍历转换的列表中以相反的顺序并为每个元件使用来自先前

上面总结为什么几乎没有人使用WPF为3D开发的输出;但应保留为linux.stackexchange.com