获取 WPF 中 Viewport3D 中所有 Point3D 的列表
Get list of all Point3D in Viewport3D in WPF
是否有一种简单的方法可以 return WPF 中 Viewport3D 对象中存在的所有 Point3D 的列表?我需要这个集合来确定 XYZ 边界,这样我就可以定位相机,使所有 Point3D 都在视野内。
如果没有简单的方法,我需要迭代哪些集合以确保捕获所有 Point3D?
我们需要遍历一个非常长的层次结构才能获得您想要的数据。
Viewport3D.Children
returns一个Visual3DCollection
object其中包含一组Visual3D
Visual3D
有 3 个 child class;我们对 ModelVisual3D
感兴趣
ModelVisual3D.Children
returns另一个Visual3DCollection
;你可以清楚地看到递归树结构 Viewport3D
在 root
ModelVisual3D.Visual3DModel
returns一个Model3D
object
Model3D
有 3 个 child class;我们对 GeometryModel3D
和 Model3DGroup
感兴趣
Model3DGroup.Children
是Model3D
的另一个列表;因此我们有两层递归包含
GeometryModel3D.Geometry
returns一个Geometry3D
object
奇怪的是,Geometry3D
只有一个child class MeshGeometry3D
MeshGeometry3D.Positions
终于给出了原始的点数列表
请注意,这些点位于其 parent Geometry3D
object 的 local 碱基中。为了获得世界坐标,当您遍历层次结构时,您必须积累您遇到的任何 Model3D
object 的变换列表,并使用它们来变换输出点。
Model3D.Transform
returns一个Transform3D
object
Transform3D
有 3 个 child classes - AffineTransform3D
、MatrixTransform3D
和 Transform3DGroup
;但是我们不需要单独处理它们
Transform3D.Transform(Point3D)
不言自明
- 我没有看到两个
Transform3D
classes(MatrixTransform3D
除外)之间的乘法运算符,因此对于每个 Point3D
你必须遍历转换列表倒序并连续应用每个转换
以上总结了为什么几乎没有人使用 WPF 进行 3D 开发...应该保留给 linux.stackexchange.com 的讨论。
是否有一种简单的方法可以 return WPF 中 Viewport3D 对象中存在的所有 Point3D 的列表?我需要这个集合来确定 XYZ 边界,这样我就可以定位相机,使所有 Point3D 都在视野内。
如果没有简单的方法,我需要迭代哪些集合以确保捕获所有 Point3D?
我们需要遍历一个非常长的层次结构才能获得您想要的数据。
Viewport3D.Children
returns一个Visual3DCollection
object其中包含一组Visual3D
Visual3D
有 3 个 child class;我们对ModelVisual3D
感兴趣
ModelVisual3D.Children
returns另一个Visual3DCollection
;你可以清楚地看到递归树结构Viewport3D
在 rootModelVisual3D.Visual3DModel
returns一个Model3D
objectModel3D
有 3 个 child class;我们对GeometryModel3D
和Model3DGroup
感兴趣
Model3DGroup.Children
是Model3D
的另一个列表;因此我们有两层递归包含GeometryModel3D.Geometry
returns一个Geometry3D
object奇怪的是,
Geometry3D
只有一个child classMeshGeometry3D
MeshGeometry3D.Positions
终于给出了原始的点数列表
请注意,这些点位于其 parent Geometry3D
object 的 local 碱基中。为了获得世界坐标,当您遍历层次结构时,您必须积累您遇到的任何 Model3D
object 的变换列表,并使用它们来变换输出点。
Model3D.Transform
returns一个Transform3D
objectTransform3D
有 3 个 child classes -AffineTransform3D
、MatrixTransform3D
和Transform3DGroup
;但是我们不需要单独处理它们Transform3D.Transform(Point3D)
不言自明- 我没有看到两个
Transform3D
classes(MatrixTransform3D
除外)之间的乘法运算符,因此对于每个Point3D
你必须遍历转换列表倒序并连续应用每个转换
以上总结了为什么几乎没有人使用 WPF 进行 3D 开发...应该保留给 linux.stackexchange.com 的讨论。