- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
VCGLib讲述
HYPERLINK /youthlion/archive/2012/04/21/2461025.html VCGLib中邻接关系的实现
VCGLib中邻接关系的维护依赖于各种单形中存储的相关信息。在VCGLib中几乎所有的算法实现都假设存在vcg::face::VertexRef,该属性存储了三个指向顶点对象的指针,可以通过V()函数访问。
面-面邻接关系
面之间的邻接关系存储于vcg::face::FFAdj(正四面体为vcg::face::TTAdj),该属性通过边来记录面之间的邻接关系。下图显示了两个三角形面:
图中顶点编号从0到2,以逆时针顺序编号,边i(i=0..2)的两个端点分别为i和(i+1)%3,因此图中面f0和面f1的公共边对f0而言是0,对f1而言是1。
对于面f的每个边e,vcg::face::FFAdj存储以下信息:
FFp(e):指向共享边e的面的指针,若e是border,则该指针指向自己;
FFi(e):在指向的面中e的索引。
例如在上图中,有:
f1-FFp(1) == f0
f1-FFi(1) == 0
f0-FFp(0) == f1
f0-FFi(0) == 1
VCGLib中对于非流形的情况也有考虑,因为只是想简单了解,没有看。
Pos
三角网格中,Pos为一三元组,pos = {v,e,f},e是f的边,v是e的端点。下图以小三角形的形式显示了三角网格中的一些pos,在每个面中,每个小三角形指向一个顶点,倚靠一条边。这样就能保证任意给定一个pos c,若只改变c的三元组的一个分量,能够唯一确定一个邻居pos。
从一个pos移动到该pos的一个邻居的操作称为Flip,把改变顶点,边和面的Flip操作分别记做FlipV,FlipE和FlipF。
例如,对于上图中的c0而言,其三元组中除了顶点,其他分量都相同的pos只有一个,即c2。记c2 = FlipV(c1)。
类似地,有:
c2 = FlipV(c1)
c0 = FlipE(c1)
c3 = FlipF(c0)
环绕v逆时针遍历:
c4 = FlipE(FlipF(c0))
c5 = FlipE(FlipF(c4))
在border上的情况:
c6 = FlipE(FlipF(c5))
环绕v顺时针遍历:
c3 = FlipE(FlipF(c6))
c1 = FlipE(FlipF(c3))
border:
c0 = FlipE(FlipF(c1))
可以发现,当两个flip嵌套操作的时候,根据pos与面的关系,可以实现顺时针或逆时针的pos转换。并且由于面-面邻接关系的定义方式,当pos在border上的时候,FlipF操作会返回到pos本身所在的面。
下面的例子展示了如何使用pos在顶点周围迭代
/* vcglib/apps/sample/trimesh_pos_demo/trimesh_pos_demo.cpp */
?
#include vcg/simplex/face/pos.h // include the definition of pos
?
//...includes to define your mesh type
?
//class MyVertex: ...
class MyFace: public vcg::FaceSimp2MyVertex,MyEdge,MyFace, vcg::face::VertexRef, vcg::face::FFAdj{};
?
void OneRingNeighborhood( MyFace * f)
{
MyVertex * v = f-V(0);
MyFace* start = f;
vcg::face::PosMyFace p(f,0,v);
// constructor that takes face, edge and vertex
do
{
p.FlipF();
p.FlipE();
}while(p.f!=start);
}
Jumping Pos
Jumping Pos类似Pos,但在遇到border的时候不会反弹回去,而是跨到下一个border-face上去。下面这个例子中,上图中的p会从f0跨到f2。
/* vcglib/apps/sample/trimesh_pos_demo/trimesh_pos_demo.cpp */
?
#include vcg/simplex/face/jumping_pos.h // include the definition of jumping pos
?
//...includes to define your mesh type
?
//class MyVertex:
文档评论(0)