하나의 프로젝트에 대해 작업하고 있습니다. 우리는 메쉬 3D를 생성하고 3D 객체의 볼륨을 거의 계산하지 않아도됩니다.어떻게이 메쉬 3D의 볼륨을 계산합니까?
계산 방법을 모르겠지만 수학 지식이 너무 적습니다. 난 당신이 볼륨의 계산을 요청 제목 더 많은 응답을 얻었을 것이라고 생각 나는 모든 코드를 찾고 있지 않다하지만 방향 또는 의사 코드
하나의 프로젝트에 대해 작업하고 있습니다. 우리는 메쉬 3D를 생성하고 3D 객체의 볼륨을 거의 계산하지 않아도됩니다.어떻게이 메쉬 3D의 볼륨을 계산합니까?
계산 방법을 모르겠지만 수학 지식이 너무 적습니다. 난 당신이 볼륨의 계산을 요청 제목 더 많은 응답을 얻었을 것이라고 생각 나는 모든 코드를 찾고 있지 않다하지만 방향 또는 의사 코드
이
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을 사용할 수 있는지 모르겠지만, 이것은 당신이 시작할 수 있어야합니다.
감사합니다. PCL? – Bolo
포인트 클라우드 라이브러리 : http://pointclouds.org/ – Deepfreeze
오늘은 사이트에만 액세스 할 수 없습니다. 다시 작업을 시작해야합니다. – Deepfreeze
여기에 귀하의 코드/정보를 게시하십시오. 아무도 도와 줄 외부 사이트에 가고 싶지 않다 –
@JonathonReinhart 사진에 – Bolo