1

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

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

4

1 回答 1

4

我们需要遍历一个非常长的层次结构才能获得所需的数据。

  • Viewport3D.Children返回一个Visual3DCollection对象,其中包含一组Visual3D

  • Visual3D有3个子班;我们感兴趣ModelVisual3D

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

  • ModelVisual3D.Visual3DModel返回一个Model3D对象

  • Model3D有3个子班;我们感兴趣GeometryModel3D并且Model3DGroup

  • Model3DGroup.Children是另一个列表Model3D;因此我们有两层递归包含

  • GeometryModel3D.Geometry返回一个Geometry3D对象

  • 奇怪的是,Geometry3D只有一个孩子班MeshGeometry3D

  • MeshGeometry3D.Positions最后给出一个原始的点列表


请注意,这些点位于其父对象的本地基础中。Geometry3D为了获得世界坐标,当您遍历层次结构时,您必须累积Model3D遇到的任何对象的变换列表,并使用它们来变换输出点。

  • Model3D.Transform返回一个Transform3D对象
  • Transform3D有 3 个子类-AffineTransform3DMatrixTransform3D; Transform3DGroup但是我们不需要单独处理它们
  • Transform3D.Transform(Point3D)非常不言自明
  • 我没有看到两个Transform3D类之间的乘法运算符(除了MatrixTransform3D),因此对于每个类,您必须以相反的顺序Point3D遍历转换列表并连续应用每个转换

以上总结了为什么几乎没有人使用 WPF 进行 3D 开发......应该为linux.stackexchange.com保留讨论。

于 2017-08-02T08:40:44.383 回答