2017-12-19 7 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,5X,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 함수의 반환 형식이 void 일 때 위의 큐브 Object가 없습니다. 좀 더 설명해 주시겠습니까? –

+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 

여기서 검색 한 바운드는 실제로 정확합니다.


두 번째 부분에 대해서는. 당신이 요청한 것은 생각만큼 간단하지 않습니다. 이 툴킷은 메쉬 조작 도구처럼 보이기 때문에 AddBox은 (전통적으로 말하면) 상자, 즉 6 개의 꼭지점이있는 객체를 실제로 생성하지 않지만 후드 아래에 여러 메쉬 폴리곤/삼각형을 생성합니다. 이것은 비록 지오메트리가 여전히 물리적 중심을 가지고 있고 '상자'처럼 보일지라도, 당신이 요구 한 것을하는 것이 (많은 가정이 없다면) 매우 까다 롭다는 것을 의미합니다.

예를 들어 실제로 상자와 함께 동일한 모델 그룹에 원통 또는 튜브를 추가 할 수 있습니다. 그렇다면 children.find은 각 어린이가 정교한 수표가없는 상자인지 여부를 알 수 없습니다. 당신은 당신이 항상 유일한 모델 그룹 내부에 상자를해야합니다 알고 있다면 당신은 순수하게하려면

  • 는, 당신은 저장 Children
  • 을 반복함으로써 Bound 숙박 시설의 MinimumMaximum이 검사를 할 몇 가지 구조를 사용 할 수 있습니다 상자 모음을 사용하면 KD-Tree와 같은 알고리즘을 사용하여 자신 만의 상자 컬렉션을 구현할 수 있습니다.
+0

Thanks mate! 그것은 정말로 도움이되었습니다! –