是否有一种简单的方法可以返回WPF中Viewport3D对象中存在的所有Point3D的列表?我需要这个集合来确定XYZ边界,以便我可以定位摄像机,使得所有Point3D都在视野范围内。
如果没有简单的方法,我需要迭代哪些集合以确保捕获所有Point3D?
答案 0 :(得分:0)
我们需要遍历一个非常冗长的层次结构来获取所需的数据。
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
对象的 local 基础中。为了获得世界坐标,当您遍历层次结构时,您必须累积所遇到的任何Model3D
个对象的转换列表,并乘以最后的点。
Model3D.Transform
会返回Transform3D
个对象Transform3D
有3个子课程 - AffineTransform3D
,MatrixTransform3D
和Transform3DGroup
;但这次我们不需要考虑它们Transform3D.Transform(Point3D)
非常自我解释Transform3D
类之间的乘法运算符(MatrixTransform3D
除外),因此对于每个Point3D
,您必须以相反的顺序遍历转换列表 < / em>并为每个元素使用前一个以上总结了为什么几乎没有人使用WPF进行3D开发;但这应保留给linux.stackexchange.com。