-
VCG文档 - 安装 VCG 库(Installing the VCG Library)
2017-08-12 22:22:56安装 VCG 库使用托管在 github 的代码仓库来管理。 项目主页地址为 vcg 。 发布的稳定版本在 vcg-release 可以看到。...文件夹结构VCG库主要由头文件构成(核心部分完全是头文件)而不依赖额外的东西. 只需下安装
- VCG 库使用托管在 github 的代码仓库来管理。 项目主页地址为 vcg 。
- 发布的稳定版本在 vcg-release 可以看到。
- 获取开发vcg的开发版本,可以通过命令
git clone -b devel https://github.com/cnr-isti-vclab/vcglib.git
文件夹结构
VCG库主要由头文件构成(核心部分完全是头文件)而不依赖额外的东西. 只需下载压缩包并解压到一个
文件夹. 例如, 解压到命名为 vcg 的文件夹, 并且设置为编译器的include
目录. 以后, 你只需要
像app/sample/
中的例子那样包含你需要的头文件即可.在 vcg 文件夹中, 你可以看到5个子文件夹:
- vcg: vcg的核心代码,包括所有算法和数据结构的定义. 这部分纯粹使用大量的
C++
模板和STL
来实现通用的数据结构和算法. 除了包含C++
标准库之外, 这里没有使用其他的库.
注意: 核心部分仅由*.h
文件组成. - wrap: 这里包含了一些额外的扩展wrap. 例如, 导入导出各种格式的网格数据, 通过OpenGL 渲染三角网格, 支持常见的GUI 工具,比如轨迹球, 等等…
- apps: 这个文件夹包含了使用vcg开发的一些命令行程序. 许多都可以在 MeshLab 中找到.
apps/sample
包含了许多很基础的小例子. 通过阅读这个文件夹中的例子来学习 vcg 是一种很好的方式. - docs: 文档存放在这里.(包含此教程)
- eigenlib: 线性代数库
eigen
的最新版本. vcg 的高级矩阵运算依赖于eigen
库.
-
Ubuntu16.04安装 VCG 库
2020-07-12 22:43:09安装 VCG 库使用托管在 github 的代码仓库...VCG库主要由头文件构成(核心部分完全是头文件)而不依赖额外的东西. 只需下载压缩包并解压到一个 文件夹. 例如, 解压到命名为 vcg 的文件夹, 并且设置为编译器的includ...安装
- VCG 库使用托管在 github 的代码仓库来管理。
- 项目主页地址为:https://github.com/cdcseacave/VCG (使用这个下载,这个在更新)
或者 https://github.com/cnr-isti-vclab/vcglib/
- 发布的稳定版本在 vcg-release :https://github.com/cnr-isti-vclab/vcglib/releases可以看到。
- 获取开发vcg的开发版本,可以通过命令
git clone https://github.com/cdcseacave/VCG.git vcglib
如果有下面这个问题:
fatal: unable to access 'https://github.com/cdcseacave/VCG.git/': GnuTLS recv error (-54): Error in the pull function.
就输入下面这个命令进行下载:
git clone git://github.com/cdcseacave/VCG.git vcglib
下载完,将文件移动到自己的software目录中即可,无需编译
mv vcglib ~/software/
完成。
文件夹结构
VCG库主要由头文件构成(核心部分完全是头文件)而不依赖额外的东西. 只需下载压缩包并解压到一个
文件夹. 例如, 解压到命名为 vcg 的文件夹, 并且设置为编译器的include
目录. 以后, 你只需要
像app/sample/
中的例子那样包含你需要的头文件即可.在 vcg 文件夹中, 你可以看到5个子文件夹:
- vcg: vcg的核心代码,包括所有算法和数据结构的定义. 这部分纯粹使用大量的
C++
模板和STL
来实现通用的数据结构和算法. 除了包含C++
标准库之外, 这里没有使用其他的库.
注意: 核心部分仅由*.h
文件组成. - wrap: 这里包含了一些额外的扩展wrap. 例如, 导入导出各种格式的网格数据, 通过OpenGL 渲染三角网格, 支持常见的GUI 工具,比如轨迹球, 等等…
- apps: 这个文件夹包含了使用vcg开发的一些命令行程序. 许多都可以在 MeshLab 中找到.
apps/sample
包含了许多很基础的小例子. 通过阅读这个文件夹中的例子来学习 vcg 是一种很好的方式. - docs: 文档存放在这里.(包含此教程)
- eigenlib: 线性代数库
eigen
的最新版本. vcg 的高级矩阵运算依赖于eigen
库.
参考:https://blog.csdn.net/zdafei2010/article/details/77131563
-
VCG库读取点云文件并绘制
2016-04-01 11:59:06读取点云文件,用VCG库对其进行处理,返回三角形网格数据,然后用OpenTK进行绘制。能处理海量的点云文件,300W点数据处理只需10S左右! -
VCG库之如何定义网格类型
2020-11-10 15:06:17VCG库提供了几种编码网格的方式,但最常用的一种是顶点向量容器和三角形向量容器(如用于三角网格的三角形和用于四边形网格的四边形)。以下是一个VCG网格类型的定义: class MyMesh: public vcg::tri::TriMesh< ...如何定义网格类型
VCG库提供了几种编码网格的方式,但最常用的一种是顶点向量容器和三角形向量容器(如用于三角网格的三角形和用于四边形网格的四边形)。以下是一个VCG网格类型的定义:
class MyMesh: public vcg::tri::TriMesh< std::vector<MyVertex>, std::vector<MyFace> , std::vector<MyEdge> > { };
其中,
vcg::tri::TriMesh
是定义三角网格的基类,基于如下模板:包含顶点的容器类型和包含面片的STL随机访问容器类型。
换句话说,网格的定义只需要从vcg::tri::TriMesh
中派生并提供个人编码网格的元素容器。下面的示例中我们还传递了一个std::vector<MyEdge>
,很快会看到,其代表的是边。#include<vcg/complex/complex.h> class MyVertex; class MyEdge; class MyFace; struct MyUsedTypes : public vcg::UsedTypes<vcg::Use<MyVertex>::AsVertexType, vcg::Use<MyEdge> ::AsEdgeType, vcg::Use<MyFace> ::AsFaceType>{}; class MyVertex : public vcg::Vertex<MyUsedTypes, vcg::vertex::Coord3f, vcg::vertex::Normal3f, vcg::vertex::BitFlags >{}; class MyFace : public vcg::Face<MyUsedTypes, vcg::face::FFAdj, vcg::face::VertexRef, vcg::face::BitFlags > {}; class MyEdge : public vcg::Edge<MyUsedTypes> {}; class MyMesh : public vcg::tri::TriMesh<std::vector<MyVertex>, std::vector<MyFace> , std::vector<MyEdge> > {};
面片、边和顶点是理解VCG库的关键元素。一个顶点、一条边、一个面片以及一个四面体仅仅是用户定义的属性集合。例如,你可能希望
MyVertex
包含顶点的坐标,那么在该顶点处的表面法线、颜色等要如何处理?VCG库给您提供了一种方式,使得您可以在每个顶点、边或者面片中存储想要的属性。例如,以下定义了三种顶点类型,复杂度逐渐增加:class MyVertex0 : public vcg::Vertex< MyUsedTypes, vcg::vertex::Coord3f, vcg::vertex::BitFlags >{}; class MyVertex1 : public vcg::Vertex< MyUsedTypes, vcg::vertex::Coord3f, vcg::vertex::Normal3f, vcg::vertex::BitFlags >{}; class MyVertex2 : public vcg::Vertex< MyUsedTypes, vcg::vertex::Coord3f, vcg::vertex::Color4b, vcg::vertex::CurvatureDirf, vcg::vertex::Qualityf, vcg::vertex::Normal3f, vcg::vertex::BitFlags >{};
vcg::Vertex
是VCG中顶点的基类。vcg::UsedTypes
则声明了网格定义中涉及的类型。实际上,它是一个用户自定义实体类型的名称以及这些实体类型在网格定义中所起作用之间的映射。该映射是使用带语法的模板参数实现的。它看起来很繁琐,但对于使用来说非常方便。正如你所看到的,上述三种顶点定义的模板参数(或者成分)不同。这些参数指定了顶点类型中存储的值。
为了方便,VCG库中实现了许多参数,完整的参数列表可以在Vertex Components,Edge Components以及Face Components包中找到。你可以任意组合这些参数作为自定义顶点/边/面片类型的模板参数(顺序不重要)。现在,我们能够有效地定义MyMesh
类型:#include<vcg/complex/complex.h> class MyVertex; class MyEdge; class MyFace; struct MyUsedTypes : public vcg::UsedTypes<vcg::Use<MyVertex> ::AsVertexType, vcg::Use<MyEdge> ::AsEdgeType, vcg::Use<MyFace> ::AsFaceType>{}; class MyVertex : public vcg::Vertex< MyUsedTypes, vcg::vertex::Coord3f, vcg::vertex::Normal3f, vcg::vertex::BitFlags >{}; class MyFace : public vcg::Face< MyUsedTypes, vcg::face::FFAdj, vcg::face::VertexRef, vcg::face::BitFlags > {}; class MyEdge : public vcg::Edge< MyUsedTypes> {}; class MyMesh : public vcg::tri::TriMesh< std::vector<MyVertex>, std::vector<MyFace> , std::vector<MyEdge> > {}; int main( int argc, char **argv ) { if(argc<2) { printf("Usage trimesh_base <meshfilename.obj>\n"); return -1; } MyMesh m; if(vcg::tri::io::ImporterOFF<MyMesh>::Open(m,argv[1])!=vcg::tri::io::ImporterOFF<MyMesh>::NoError) { printf("Error reading file %s\n",argv[1]); exit(0); } vcg::tri::RequirePerVertexNormal(m); vcg::tri::UpdateNormal<MyMesh>::PerVertexNormalized(m); printf("Input mesh vn:%i fn:%i\n",m.VN(),m.FN()); printf( "Mesh has %i vert and %i faces\n", m.VN(), m.FN() ); return 0; }
注:
vcg::face::VertexRef
是一个属性,该属性存储三个指向顶点类型的指针,因此实现了可索引的数据结构。这是一个为什么MyFace
类型需要知道MyVertex
类型的示例。如何创建网格
当声明好网格类型后,你可能想要实例化一个对象并且使用顶点和三角形去填充该对象。经典的做法就是打开一些诸如上述代码中的文件。也许你能想到对顶点和面片容器进行
push_back
操作。实际上,这是错误的方法,因为将元素添加到容器中可能会产生副作用。我们在Allocating and Deleting mesh elements页面中讨论这个问题并给出正确的添加网格元素的方法。网格元素的flags
通常,对于网格的一个元素来说,我们为其分配一个小的bit向量容器,该容器包含顶点和面相关的位信息。例如,顶点的删除仅仅在该向量中标记为一个删除位。更多有关flags的细节请查看Bit Flags页面。
如何处理网格
在网格上执行某些操作的算法通常被编写为类的静态成员函数。 例如,下面插入的代码是UpdateNormals类的一部分,该类包含几种计算法线值的算法。
... template <class ComputeMeshType> class UpdateNormals{ ... // Calculates the face normal (if stored in the current face type) static void PerFace(ComputeMeshType &m) // Calculates the vertex normal. Without exploiting or touching face normals // The normal of a vertex v is the weigthed average of the normals of the faces incident on v. static void PerVertex(ComputeMeshType &m) // Calculates both vertex and face normals. // The normal of a vertex v is the weigthed average of the normals of the faces incident on v. static void PerVertexPerFace(ComputeMeshType &m) ... };
该类是名为UpdateValue类的核心部分,该类可计算顶点或面片属性的值,可以在文件夹vcg / complex / trimesh / update中找到。 例如,以下示例显示如何计算法线以及每个顶点的均值和高斯曲率值:
#include <vector> #include <vcg/simplex/vertex/base.h> #include <vcg/simplex/vertex/component.h> #include <vcg/simplex/face/base.h> #include <vcg/simplex/face/component.h> #include <vcg/complex/trimesh/base.h> #include <vcg/complex/trimesh/update/normals.h> //class UpdateNormals #include <vcg/complex/trimesh/update/curvature.h> //class UpdateCurvature class MyVertex; class MyFace; class MyUsedTypes: public vcg::UsedTypes< vcg::Use<MyVertex>::AsVertexType>, vcg::Use<MyFace>::AsFaceType> class MyVertex: public vcg::Vertex<MyUsedTypes, vcg::vertex::BitFlags,vcg::vertex::Coord3d, vcg::vertex::Normal3f,vcg::vertex::Curvaturef>{}; class MyFace: public vcg::Face<MyUsedTypes, vcg::face::BitFlags,vcg::face::VertexRef>{}; class MyMesh: public vcg::tri::TriMesh< std::vector<MyVertex>, std::vector<MyFace> > {}; int main() { MyMesh m; // fill the mesh ... // compute the normal per-vertex -> update the value of v.N() for all v (vcg::vertex::Normal3f) vcg::tri::UpdateNormals<MyMesh>::PerVertexPerFace(m); // compute the curvature per-vertex -> update the value of v.H() and v.K() (vcg::vertex::Curvaturef) vcg::tri::UpdateCurvature<MyMesh>::MeanAndGaussian(m); return 0; }
除了更新网格属性值的算法之外,VCG库还提供了从另一个源创建网格的算法,例如从点集(通过Ball Pivoting方法)或从体数据集的等值面(通过Marching Cubes 算法)。这些算法可以在vcg / complex / trimesh / create /中找到。 最后,您可以在/ vcg / complex / trimesh下找到用于细分(中点,循环,蝶形…),平滑,封闭孔和其他当前未归类在任何特定标题下的算法。
-
VCG库的使用
2016-12-19 21:29:23 -
VCG库之分配和删除网格元素
2020-11-12 10:50:32创建元素 创建单个三角面片或者向已有的网格中新增元素,可以使用AddVertices和AddFaces函数。元素是添加到网格(存储)的末尾的。这些函数返回指向第一个分配元素的指针。...class MyMesh : public vcg -
VCG Eigen库学习记录
2018-08-14 21:50:18线性代数的eigen库最近的稳定版本的一个副本(相当于就是借用第三方库了),VCGLib中的高级矩阵操作都是基于这个库的。 用vs编译使用Eigen非常方便。 #include <iostream> #include <... -
vcg函数值_几个经典的数学库之一学习---VCGlib(2)
2020-12-19 07:29:10VCG库提供了一种可以指定可选组件的方法。如属性信息并不是静态保存在simplex(简素)中的,而是当被需要他们的时候,静态分配这些属性信息的。定义使用这些组件,需要做以下两种事情: (1)使用在mesh的... -
求VCG大神!!!修改空间原点。
2018-12-17 07:43:15VCG库里面,如何修改空间坐标原点。比如说我在原来基础上新增了一个坐标系,如何使这个新建的坐标系激活,成为原点为(0,0,0)的世界坐标系。 -
VCG文档 - 邻接与拓扑(Adjacency and Topology)
2017-08-17 17:38:09邻接关系VCG 库没有单一的,硬编码的方式来对三角形和边之间的关系进行编码. 这一切都取决于存储哪些属性以及如何使用它们. 在前面几节的例子中, 面的定义总是包含 vcg::face::VertexRef 属性, 这个属性存储了可以... -
VCG文档 - 基本概念 (Basic Concepts)
2017-08-15 17:52:10如何定义曲面网格类型vcg 库可以用多种方式表达一个曲面网格, 通常的方式是一个顶点集合和一个三角形集合(例如, 由三角形组成的三角网格). 下面一行代码是定义曲面类型的例子:class MyMesh : public vcg::tri::... -
vcg函数值_几个经典的数学库之一学习---VCGlib(1)
2020-12-19 07:29:121. VCG Libary是Visulization and Computer Graphics Libary(可视化与计算机图形学库)的缩写,是一个开源的C++模板库,用于三角网格和四面体网格的控制、处理和OpenGL显示。其中包含了超过100 000行的代码。基于该库... -
VCG简介与安装
2016-09-07 17:58:531 学习背景 最近在需要用到meshlab中的网格简化与平滑功能并要嵌到...最后发现meshlab中的简化和平滑功能原来是依赖于VCG这个库的,并且VCG是可以单独使用的,于是就开始学习VCG,然后封装成项目需要的接口。2 VCG简介 -
vcg函数值_几个经典的数学库之一学习---VCGlib(3)
2020-12-29 00:39:21Shot(镜头) and camera(相机)shot摄像结构以及camera库。对于相机模块预览之后,shot (镜头)类的所有组件将会被介绍。然后给出重要操作的例子,如投影Projection 与 Un-Projection。以及在镜头之间与镜头与轨迹制件... -
VCG Libary学习笔记(1) 概述 安装 文件夹结构
2015-11-16 17:00:58VCG Libary库概述,安装及文件夹结构介绍。 -
【3D知识】meshlab库
2018-10-23 09:40:291、参考: https://blog.csdn.net/beifangdefengchuilai/article/details/78241565 ... 2、 开源库,meshlab算法大部分是基于一个叫ISTI-CNR视觉计算实验室开发的VCG库实现的。 ... -
几个经典的数学库之一学习---VCGlib(2)
2017-04-01 14:12:00VCG库提供了一种可以指定可选组件的方法。如属性信息并不是静态保存在simplex(简素)中的,而是当被需要他们的时候,静态分配这些属性信息的。 定义使用这些组件,需要做以下两种事情: (... -
MeshLab和VCG的开发环境配置
2012-10-22 23:02:08Meshlab和VCGlib都是意大利国立研究院的作品...VCGlib是标准C++库写的,其提供了IO与封装OpenGL来显示。Meshlab的界面是用QT来写的,因此需要QT SDK的支持。 各软件的地址链接为: (1)MeshLab源代码SVN: https:/ -
使用vcglib创建和输出模型
2020-11-15 16:08:13本文是对vcg库自带的示例进行学习,从而达到熟练使用该库的目的。 网格结构定义 使用vcglib定义网格结构非常简单,如果不考虑深入研究其内部实现的话。代码如下: //mymesh.h #include<vcg/complex/complex.h>... -
MeshLab配置和编译
2017-07-16 20:40:34MeshLab配置和编译 MeshLab(http://sourceforge.net/p/meshlab)是一个用QT开发的、...尤其适合于处理3D扫描得到的网格。它的核心是使用VCG库(一个C++的3D网格处理库,http://sourceforge.net/projects/vcg/),Mes -
MeshLab 编译
2017-09-01 15:26:56准备工作 安装VS2015 ...用 Git 从 vcglib vcg 库 注意, 3,4 两步的要在同一个目录.正确的文件结构如下 yourdevelfolder/ | ├──meshlab │ ├──docs │ ├──README.md │ ├──src │ ├── -
sketchfab中文网_meshlab中文版下载
2020-12-21 07:56:52meshlab中文版是一款开源便携式可扩展程序,可以对点云进行各种操作,比如滤波、降采样、构网、重建等,基于VCG库,当然还可基于其他的一些第三方库进行扩展。支持生成原始数据和3D打印模型功能,非常实用。小编还... -
MeshLab学习
2014-05-02 18:07:48MeshLab是一个开源的、portable、开扩展的系统,用于处理和编辑非结构化...这个系统的所有网格处理任务非常依赖VCG库,这个库开发自ISTI-CNR的Visual Computing Lab。它可以在Windows、Linus及MacOSX上运行。这个系... -
几个经典的数学库之一学习---VCGlib
2017-11-13 10:49:451. VCG Libary是Visulization and Computer Graphics Libary(可视化与计算机图形学库)的缩写,是一个开源的C++模板库,用于三角网格和四面体网格的控制、处理和OpenGL显示。其中包含了超过100 000行的代码。基于该库... -
3D模型网格处理开源库集合
2021-02-24 10:58:321、CGAL 2、VCG 3、PCL 4、libigl -
几个经典的数学库之一学习---VCGlib(1)
2017-03-29 17:19:001. VCG Libary是Visulization and Computer Graphics Libary(可视化与计算机图形学库)的缩写,是一个开源的C++模板库,用于三角网格和四面体网格的控制、处理和OpenGL显示。其中包含了超过100 000行的代码。基于该库... -
VCGlib资源及解决VCGlib库之中的“ LNK2019: 无法解析的外部符号”问题
2020-04-18 18:00:59VCGlib资源及解决VCGlib库之中的“ LNK2019: 无法解析的外部符号”问题问题描述解决办法VCGlib库资源...LNK2019 无法解析的外部符号 "private: void __cdecl vcg::ply::PlyFile::compile(class vcg::ply::PlyElement...