无法确定特定几何体的位置和使用其位置和大小检索几何体的方法
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
属性 的 Minimum
和 Maximum
来完成检查,通过迭代 Children
- 如果你纯粹想要一些结构来存储你的盒子集合,你可以只实现你自己的盒子集合,也许借助像 KD-Tree 这样的算法来执行更快的 run-time 搜索。
我正在使用 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
属性 的Minimum
和Maximum
来完成检查,通过迭代Children
- 如果你纯粹想要一些结构来存储你的盒子集合,你可以只实现你自己的盒子集合,也许借助像 KD-Tree 这样的算法来执行更快的 run-time 搜索。