2017-12-19 12 views
0

私は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 }); 

今、私は幾何学的オブジェクトを取得するために、さらにいくつかの行を書きました。私はRect3Dオブジェクトに私のカーソルを指摘し、場所とX,Y,Zサイズの値を見てみました

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

は、それが {0,8,5}それぞれ 13,5,5など X,Y,Zとして表示する場所でした。

しかし、私のキューブのサイズは2で、場所は{1,9,15}です。私はなぜその印刷いくつかの間違った価値を理解していない。

また、利用可能なすべてのメソッドを実行しましたが、位置と中心値を渡すと、GeometryModel3Dオブジェクトを取得するメソッドが見つかりませんでした。キューブの位置とそのサイズがある場合は、Geometry3Dオブジェクトを取得できますか?なぜなら、子どもを検索しようとすると、子ども全体をループさせて、それぞれの子どもが望む場所を確認しようとすると、本当に大きなプログラムになり、計算時間が増えるからです。

私はこのような何かをしたい:

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

誰かがこれら二つの質問に答えることができる場合、私は、本当に喜んでいるだろう。 ありがとうございました

+0

'ToMesh'コールの後でもまだキューブオブジェクトを持っていますか?この名前は、ジオメトリをメッシュのポリゴン/トライアングルに変えることを示唆しています。 – zcui93

+0

しかし、上記のキューブオブジェクトはありません。なぜなら、AddBox関数の戻り値の型が無効なためです。もう少し説明していただけますか? –

+0

私はちょうどツールキットを取り下げました。残念ながらあなたのコードはコンパイルされないので、これを再現することすらできません – zcui93

答えて

0

ツールキットのv1.0.0releaseを使用してコードを大雑把に作成することができました。

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 

ここで取得されたバインドは実際には正しいです。


質問の第2の部分については、あなたが要求したことは、あなたが思ったほど単純ではありません。このツールキットはメッシュ操作ツールのように見えるので、AddBoxは実際に(伝統的に言えば)ボックスを作成しません。つまり、6つの頂点を持つオブジェクトですが、フードの下にいくつかのメッシュポリゴン/三角形を生成します。これは、ジオメトリがまだ物理的な中心を持ち、 'ボックス'のように見えますが、あなたが尋ねたことは(多くの前提がない限り)非常に難しいことを意味します。

たとえば、ボックスの横にある同じモデルグループに、実際にシリンダまたはチューブを追加することができます。その後、children.findは、各子供が箱であるかどうかを知ることができません(洗練された小切手なし)。

  • あなたは常に、あなたのモデルグループ内のボックスを持っていることを知っている場合は、純粋に、いくつかの構造は、あなたを保存したい場合は、Children
  • を反復することにより、チェックを行うためにBoundプロパティのMinimumMaximumを使用することができますおそらく、KD-Treeのようなアルゴリズムの助けを借りて、より速いランタイム検索を実行するために、独自のボックスコレクションを実装することができます。
+0

ありがとうございます!本当に助けになりました! –

関連する問題