获取WPF中Viewport3D中所有Point3D的列表
问题描述:
是否有一种简单方法可以返回WPF中Viewport3D对象中存在的所有Point3D的列表?为了确定XYZ边界,我需要这个集合,以便我可以定位相机,使得所有Point3D都在视野内。获取WPF中Viewport3D中所有Point3D的列表
如果没有简单的方法,我需要迭代哪些集合以确保捕获所有Point3D?
答
我们需要遍历一个非常漫长的层次结构来获取所需的数据。
Viewport3D.Children
返回Visual3DCollection
对象含有一组Visual3D
Visual3D
具有3个类;我们有兴趣ModelVisual3D
ModelVisual3D.Children
返回另一个Visual3DCollection
;你可以清楚地看到递归树结构Viewport3D
在根ModelVisual3D.Visual3DModel
返回Model3D
对象Model3D
有3个类;我们感兴趣的是GeometryModel3D
和Model3DGroup
Model3DGroup.Children
是Model3D
的另一个列表;因此,我们必须递归遏制两层Geometry3D.Geometry
返回Geometry3D
对象Geometry3D
好奇地只有一个子类MeshGeometry3D
MeshGeometry3D.Positions
最终给出点的原始列表
请注意,这些点是在本地基础上的这Geometry3D
对象。为了获得世界坐标,当您遍历层次结构时,您必须累积您遇到的任何对象的变换列表,并乘以最后的点。
-
Model3D.Transform
返回Transform3D
对象 -
Transform3D
具有3个类 -AffineTransform3D
,MatrixTransform3D
和Transform3DGroup
;但这个时候,我们就不用再考虑这些 -
Transform3D.Transform(Point3D)
是非常自我解释 - 我没有看到一个乘法运算符将两个
Transform3D
类之间(除MatrixTransform3D
),因此每个Point3D
你必须遍历转换的列表中以相反的顺序并为每个元件使用来自先前
上面总结为什么几乎没有人使用WPF为3D开发的输出;但应保留为linux.stackexchange.com。