获取 WPF 中 Viewport3D 中所有 Point3D 的列表

Get list of all Point3D in Viewport3D in WPF

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

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

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

  • Viewport3D.Childrenreturns一个Visual3DCollectionobject其中包含一组Visual3D

  • Visual3D 有 3 个 child class;我们对 ModelVisual3D

  • 感兴趣
  • ModelVisual3D.Children returns另一个Visual3DCollection;你可以清楚地看到递归树结构 Viewport3D 在 root

  • ModelVisual3D.Visual3DModelreturns一个Model3Dobject

  • Model3D 有 3 个 child class;我们对 GeometryModel3DModel3DGroup

  • 感兴趣
  • Model3DGroup.ChildrenModel3D的另一个列表;因此我们有两层递归包含

  • GeometryModel3D.Geometryreturns一个Geometry3Dobject

  • 奇怪的是,Geometry3D只有一个child class MeshGeometry3D

  • MeshGeometry3D.Positions终于给出了原始的点数列表


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

  • Model3D.Transformreturns一个Transform3Dobject
  • Transform3D 有 3 个 child classes - AffineTransform3DMatrixTransform3DTransform3DGroup;但是我们不需要单独处理它们
  • Transform3D.Transform(Point3D) 不言自明
  • 我没有看到两个 Transform3D classes(MatrixTransform3D 除外)之间的乘法运算符,因此对于每个 Point3D 你必须遍历转换列表倒序并连续应用每个转换

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