3d - 如何计算此网格 3D 的体积?

标签 3d kinect

enter image description here我在做一个项目。我们生成了一个网格 3D,我需要计算一个 3D 对象的几个体积。

我不知道如何计算,我认为数学知识太少了。有没有办法计算这个

EDTI :我不是在寻找所有的代码,而是在寻找方向或伪代码

最佳答案

我相信你会得到一个要求计算胸部体积的标题的更多回应:)。

首先,为了计算网格的体积,它应该是一个封闭的网格。所以我认为您需要选择不需要的面/顶点并将它们从网格中删除。
比找到关闭音量的方法:

  • 在Meshlab中:尝试点集下的泊松选项
  • 或者使用即 Blender 手动关闭音量

  • 一旦完成,根据 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,但这应该可以帮助您入门。

    关于3d - 如何计算此网格 3D 的体积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27537690/

    相关文章:

    c# - visual c# 2010 两个项目之间的通信

    c# - 是否可以对kinect深度流进行预处理(在骨架引擎之前)

    c++ - 使用 VTK 连接流媒体点

    3d - 表面网格到体积网格

    python - 在 matplotlib 中正确渲染 3dplot_surface

    objective-c - OS X 上的 3D CAD 图形框架 - 有建议吗?

    c# - 调整Kinect for windows sdk 1.5中Skeleton骨骼位置

    c# - WP7 游戏的 XNA : DrawUserIndexedPrimitives

    c# - 手势识别算法——Kinect

    kinect - 如何将 kinect 骨架移动到另一个位置