2014-12-18 3 views
-2

enter image description here 하나의 프로젝트에 대해 작업하고 있습니다. 우리는 메쉬 3D를 생성하고 3D 객체의 볼륨을 거의 계산하지 않아도됩니다.어떻게이 메쉬 3D의 볼륨을 계산합니까?

계산 방법을 모르겠지만 수학 지식이 너무 적습니다. 난 당신이 볼륨의 계산을 요청 제목 더 많은 응답을 얻었을 것이라고 생각 나는 모든 코드를 찾고 있지 않다하지만 방향 또는 의사 코드

+1

여기에 귀하의 코드/정보를 게시하십시오. 아무도 도와 줄 외부 사이트에 가고 싶지 않다 –

+0

@JonathonReinhart 사진에 – Bolo

답변

2

EDTI을 calulate 수있는 방법이 있나요 가슴의 :).

시작하려면 메쉬의 볼륨을 계산하려면 닫힌 메쉬 여야합니다. 그래서 당신이 필요하지 않은면/꼭지점을 선택하고 메쉬에서 제거해야한다고 생각합니다. 볼륨 닫을 수있는 방법 찾을보다 : Meshlab에서

  • 을 :
  • 을 설정 지점에서 포아송 옵션을 시도하거나이 작업이 완료되면 볼륨을 수동으로

을 닫습니다 즉, 블렌더를 사용하여 this paper에 따르면 쉽게된다.

트릭은 삼각형을 기준으로 사면체의 서명 된 볼륨을 계산하고 원점에서 시작하는 것입니다. 볼륨의 부호는 삼각형이 원점 방향을 가리키고 있는지 여부에 따라 달라집니다. (삼각형의 정상 자체는 명시 적으로 아래에 참조가 표시되지 않는 이유는 당신의 정점의 순서에 따라 달라집니다.)

이 모두는 다음과 같은 간단한 기능으로 귀결 :

float signedVolumeOfTriangle(pcl::PointXYZ p1, pcl::PointXYZ p2, pcl::PointXYZ p3) 
{ 
    float v321 = p3.x*p2.y*p1.z; 
    float v231 = p2.x*p3.y*p1.z; 
    float v312 = p3.x*p1.y*p2.z; 
    float v132 = p1.x*p3.y*p2.z; 
    float v213 = p2.x*p1.y*p3.z; 
    float v123 = p1.x*p2.y*p3.z; 
    return (1.0f/6.0f)*(-v321 + v231 + v312 - v132 - v213 + v123); 
} 

다음 기능은 메시의 볼륨 계산하기 :

float volumeOfMesh(pcl::PolygonMesh mesh) 
{ 
    float vols = 0.0; 
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>); 
    pcl::fromPointCloud2(mesh.cloud,*cloud); 
    for(int triangle=0;triangle<mesh.polygons.size();triangle++) 
    { 
     pcl::PointXYZ pt1 = cloud->points[mesh.polygons[triangle].vertices[0]]; 
     pcl::PointXYZ pt2 = cloud->points[mesh.polygons[triangle].vertices[1]]; 
     pcl::PointXYZ pt3 = cloud->points[mesh.polygons[triangle].vertices[2]]; 
     vols += signedVolumeOfTriangle(pt1, pt2, pt3); 
    } 
    return Math.Abs(vols.Sum()); 
} 

내가 코드를 테스트하지 않았다 당신이 PCL을 사용할 수 있는지 모르겠지만, 이것은 당신이 시작할 수 있어야합니다.

+0

감사합니다. PCL? – Bolo

+0

포인트 클라우드 라이브러리 : http://pointclouds.org/ – Deepfreeze

+0

오늘은 사이트에만 액세스 할 수 없습니다. 다시 작업을 시작해야합니다. – Deepfreeze