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)函数用于计算第一个面的惯性矩阵。