获取WPF中

时间:2017-08-02 06:22:06

标签: c# wpf 3d viewport3d

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

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

1 个答案:

答案 0 :(得分: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对象的 local 基础中。为了获得世界坐标,当您遍历层次结构时,您必须累积所遇到的任何Model3D个对象的转换列表,并乘以最后的点。

  • Model3D.Transform会返回Transform3D个对象
  • Transform3D有3个子课程 - AffineTransform3DMatrixTransform3DTransform3DGroup;但这次我们不需要考虑它们
  • Transform3D.Transform(Point3D)非常自我解释
  • 我没有看到两个Transform3D类之间的乘法运算符(MatrixTransform3D除外),因此对于每个Point3D,您必须以相反的顺序遍历转换列表 < / em>并为每个元素使用前一个
  • 的输出

以上总结了为什么几乎没有人使用WPF进行3D开发;但这应保留给linux.stackexchange.com