gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:31:38 25 4
gpt4 key购买 nike

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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com