added PerVertUVArea and ScaleVertUVToMatchArea

This commit is contained in:
nico 2018-12-11 23:14:02 +11:00
parent 5ea07c4ada
commit b2bb45deb1
1 changed files with 38 additions and 0 deletions

View File

@ -43,6 +43,44 @@ class UV_Utils
typedef typename vcg::Point2<ScalarType> UVCoordType;
public:
///calculate the area in UV space
static ScalarType PerVertUVArea(MeshType &m)
{
FaceIterator fi;
ScalarType Area=0;
for (fi=m.face.begin();fi!=m.face.end();fi++)
{
if ((*fi).IsD()) continue;
UVCoordType E0= (*fi).V(1)->T().P()-(*fi).V(0)->T().P();
UVCoordType E1= (*fi).V(2)->T().P()-(*fi).V(0)->T().P();
ScalarType doubleA=fabs(E0^E1);
Area+=doubleA/2;
}
return Area;
}
///scale vert UV to match 3D area
static ScalarType ScaleVertUVToMatchArea(MeshType &m)
{
FaceIterator fi;
ScalarType Area3D=0;
for (fi=m.face.begin();fi!=m.face.end();fi++)
{
if ((*fi).IsD()) continue;
Area3D+=vcg::DoubleArea((*fi))/2;
}
ScalarType Area2D=PerVertUVArea(m);
ScalarType ScaleFact=sqrt( Area3D / Area2D );
VertexIterator vi;
for (vi=m.vert.begin();vi!=m.vert.end();vi++)
{
if ((*vi).IsD()) continue;
(*vi).T().P()*=ScaleFact;
}
}
///calculate the BBox in UV space
static vcg::Box2<ScalarType> PerWedgeUVBox(MeshType &m)
{