无法确定特定几何体的位置和使用其位置和大小检索几何体的方法

Unable to determine location of a particular geometry and Method to retrieve geometry using its location and sizes

我正在使用 HelixToolkit 并使用 C# 进行编程。

我写了下面的代码来创建一个立方体:

 var meshBuilder3 = new MeshBuilder(false, false);
 meshBuilder3.AddBox(new Point3D(1, 9, 15), 2, 2, 2);
 var mesh1000 = meshBuilder3.ToMesh(true);
 Color halfTransparent = Color.FromArgb(127, Colors.Black.R, Colors.Black.G, Colors.Black.B);
 var TranspMaterial = MaterialHelper.CreateMaterial(halfTransparent);
 modelGroup.Children.Add(new GeometryModel3D { Geometry = mesh1000, Material = TranspMaterial });

现在,我又写了几行来检索几何 object。

Model3DCollection children  = modelGroup.Children;
Model3D model = children[0];
GeometryModel3D geom3D = (GeometryModel3D)model;
Geometry3D geo3D = geom3D.Geometry;
Rect3D rec3D = geo3D.Bounds;
Point3D x = rec3D.Location;

当我将光标指向 Rect3D object 并尝试查看位置和 X,Y,Z 大小值时,它显示位置为 {0,8,5}X,Y,Z 分别为 13,5,5

但我的立方体大小为 2,位置为 {1,9,15}。我不明白为什么它会打印一些错误的值。

我也遍历了所有可用的方法,但如果我们传递位置和中心值,我找不到任何检索 GeometryModel3D object 的方法。如果我有我的立方体的位置及其大小,我可以检索 Geometry3D object。因为如果我尝试检索 children,循环整个 children 然后如果我尝试用所需的位置验证每个 children 的位置,这将是一个巨大的程序并且需要更多的计算时间。

我想要这样的东西:

GeometryModel3D geom3D = children.find(Point3D Location,double sizeX,double sizeY,double sizeZ);

如果有人能回答这两个问题,我会很高兴。 提前致谢

我已经能够通过以下代码使用工具包的 v1.0.0 release 创建大致复制的代码。

var modelGroup = new GroupModel3D();

var meshBuilder3 = new MeshBuilder(false, false);
meshBuilder3.AddBox(new Vector3(1, 9, 15), 2, 2, 2);
var mesh1000 = meshBuilder3.ToMesh();

var geomdeModel3D = new MeshGeometryModel3D {Geometry = mesh1000};
modelGroup.Children.Add(geomdeModel3D);

var children = modelGroup.Children;
var model = children[0];
GeometryModel3D geom3D = (GeometryModel3D)model;


Geometry3D geo3D = geom3D.Geometry;
var bound = geo3D.Bound;
Console.WriteLine(bound); // <--- Minimum:X:0 Y:8 Z:14 Maximum:X:2 Y:10 Z:16

此处检索到的绑定实际上是正确的。


关于你问题的第二部分。你的要求并不像你想的那么简单。由于这个工具包看起来像一个网格操作工具,AddBox 实际上并没有创建一个(传统意义上的)盒子,即一个具有 6 个顶点的 object,而是在引擎盖下生成了几个网格多边形/三角形。这意味着尽管几何体仍然有一个物理中心并且看起来像 'box',但按照您的要求进行操作非常棘手(除非有很多假设)。

例如,您实际上可以在盒子旁边的同一模型组中添加圆柱体或管子。那么你的 children.find 将无法知道每个 children 是否是一个盒子(没有复杂的检查)。

  • 如果您知道您的模型组中始终只有框,那么您可以使用 Bound 属性 的 MinimumMaximum 来完成检查,通过迭代 Children
  • 如果你纯粹想要一些结构来存储你的盒子集合,你可以只实现你自己的盒子集合,也许借助像 KD-Tree 这样的算法来执行更快的 run-time 搜索。