是否有一种简单的方法可以返回 WPF 中 Viewport3D 对象中存在的所有 Point3D 的列表?我需要这个集合来确定 XYZ 边界,以便我可以定位相机,使所有 Point3D 都在视野内。
如果没有简单的方法,我需要迭代哪些集合以确保捕获所有 Point3D?
是否有一种简单的方法可以返回 WPF 中 Viewport3D 对象中存在的所有 Point3D 的列表?我需要这个集合来确定 XYZ 边界,以便我可以定位相机,使所有 Point3D 都在视野内。
如果没有简单的方法,我需要迭代哪些集合以确保捕获所有 Point3D?
我们需要遍历一个非常长的层次结构才能获得所需的数据。
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 个子类-AffineTransform3D
和MatrixTransform3D
; Transform3DGroup
但是我们不需要单独处理它们Transform3D.Transform(Point3D)
非常不言自明Transform3D
类之间的乘法运算符(除了MatrixTransform3D
),因此对于每个类,您必须以相反的顺序Point3D
遍历转换列表并连续应用每个转换以上总结了为什么几乎没有人使用 WPF 进行 3D 开发......应该为linux.stackexchange.com保留讨论。