vcg.tri.Inertia

vcg.tri.Inertia是一个用于计算三角形网格的惯性矩阵的类。它的实现是基于C++语言的VCG库。

方法

static void Compute(VertexType *vn, const FaceType &t, MatrixType &inertia)

这个方法用于计算给定三角形网格面的惯性矩阵。

参数:

  • vn: 顶点的类型。在大多数情况下,你可以使用vcg::Point3f作为这个参数的类型。
  • t: 三角形面
  • inertia: 存储计算后的惯性矩阵

返回值:

此方法没有返回值。

属性

vcg.tri.Inertia没有公开的属性。

示例代码

以下示例代码展示了如何使用vcg.tri.Inertia计算三角形面的惯性矩阵。

#include <iostream>
#include <vcg/complex/complex.h>
#include <vcg/complex/algorithms/update/bounding.h>
#include <vcg/complex/algorithms/update/normal.h>
#include <vcg/simplex/vertexplus/base.h>
#include <vcg/complex/algorithms/update/topology.h>
#include <vcg/complex/algorithms/update/flag.h>
#include <vcg/complex/algorithms/update/color.h>
#include <vcg/complex/algorithms/update/selection.h>
#include <vcg/complex/algorithms/update/curvature.h>
#include <vcg/complex/algorithms/update/line.h>
#include <vcg/space/index/grid_static_ptr.h>
#include <vcg/space/intersection/triangle_triangle.h>
#include <vcg/complex/algorithms/clean.h>
#include <vcg/complex/algorithms/update/bounding.h>
#include <vcg/complex/algorithms/clip.h>
#include <vcg/complex/algorithms/update/topology.h>
#include <vcg/complex/algorithms/create/ball_pivoting.h>
#include <vcg/complex/algorithms/stat.h>
#include <vcg/complex/algorithms/update/flag.h>
#include <vcg/complex/algorithms/update/normal.h>
#include <vcg/complex/algorithms/update/bounding.h>
#include <vcg/complex/algorithms/update/curvature.h>
#include <vcg/complex/algorithms/update/color.h>
#include <vcg/complex/algorithms/update/selection.h>
#include <vcg/complex/algorithms/clean.h>
#include <vcg/complex/algorithms/update/topology.h>
#include <vcg/space/triangle3.h>
#include <vcg/space/point3.h>
#include <vcg/space/point4.h>
#include <vcg/complex/used_types.h>
#include <vcg/simplex/face/pos.h>
#include <vcg/complex/algorithms/create/mesh_sampling.h>
#include <vcg/space/index/grid_static_ptr.h>
#include <vcg/space/intersection_3.h>
#include <vcg/space/kdtree/index_potential_spatial_search.h>
#include <vcg/complex/algorithms/update/topology.h>
#include <vcg/complex/algorithms/create/platonic.h>
#include <vcg/complex/algorithms/point_sampling.h>
#include <vcg/complex/algorithms/smooth.h>
#include <vcg/complex/algorithms/trim.h>
#include <vcg/complex/algorithms/hole.h>
#include <vcg/complex/algorithms/wedge.h>
#include <vcg/complex/algorithms/polygon2mesh.h>
#include <vcg/gl/gl_ajl.h>
#include <vcg/complex/algorithms/local_optimization/tri_edge_collapse_quadric.h>
#include <vcg/complex/algorithms/local_optimization/tri_edge_collapse.h>
#include <vcg/complex/algorithms/point_sampling.h>
#include <vcg/tri/tri_centroid.h>
#include <vcg/tri/tri_fit_plane.h>
#include <vcg/tri/tri_scalar_fields.h>
#include <vcg/tri/tri_util.h>
#include <vcg/complex/algorithms/local_optimization/remove_duplicate.h>
#include <vcg/complex/algorithms/create/platonic.h>
#include <vcg/complex/algorithms/remove.h>
#include <vcg/complex/algorithms/update/texture.h>
#include <vcg/complex/algorithms/poisson/projection.h>
#include <vcg/complex/algorithms/poisson/ani_marching_cubes.h>
#include <vcg/complex/algorithms/import.h>
#include <vcg/simplex/edgeplus/base.h>
#include <vcg/simplex/faceplus/base.h>

using namespace vcg;

class MyVertex : public VertexPos<MyVertex>, public VertexNormal<MyVertex>, public VertexColor4b<MyVertex>, public VertexTexCoord2f<MyVertex> {};

class MyMesh : public tri::TriMesh<vector<MyVertex>, vector<FaceIndex>,vector<MyMesh::SolidVertexType *> > {};

template<typename MeshType> void ComputeInertia(MeshType & m, typename MeshType::FaceType &f)
{
  vcg::tri::UpdateBounding<MeshType>::Box(m);
  vcg::Point3f G = tri::GaussianCurvature<MyMesh::FaceType>::_compute(f);
  igl::invert(Matrix3d(G[0], 0, 0, 0, G[1], 0, 0, 0, G[2]), G);

  vcg::Matrix3d Inertia;
  vcg::tri::Inertia::Compute(MyVertex(), f, Inertia);
  std::cout << "Inertia: " << std::endl << Inertia << std::endl;
}

int main() {

  MyMesh m;

  // Read a mesh from file
  bool fOk = vcg::tri::io::Importer<MyMesh>::Open(m, "../test_files/bunny.obj");
  if (!fOk)
  {
      std::cerr << "Error reading file " << std::endl;
      return -1;
  }

  // Compute the inertia of one face
  ComputeInertia(m, m.face[0]);

  return 0;
}

这个示例代码读取并导入测试文件“bunny.obj”,接着计算了三角形网格m的第一个面的惯性矩阵,最后将结果打印在控制台上。其中,vcg.tri.Inertia::Compute(MyVertex(), f, Inertia)函数用于计算第一个面的惯性矩阵。