several major modifications
This commit is contained in:
parent
c1e19b4b55
commit
5445d99402
|
@ -44,6 +44,17 @@ namespace vcg {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
static CoordType FollowDirection(const FaceType &f0,
|
||||||
|
const typename FaceType &f1,
|
||||||
|
const typename CoordType &dir0)
|
||||||
|
{
|
||||||
|
///first it rotate dir to match with f1
|
||||||
|
CoordType dirR=vcg::tri::CrossField<MeshType>::Rotate(f0,f1,dir0);
|
||||||
|
///then get the closest upf to K*PI/2 rotations
|
||||||
|
CoordType dir1=f1.cPD1();
|
||||||
|
CoordType ret=vcg::tri::CrossField<MeshType>::K_PI(dir1,dirR,f1.cN());
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static void SetVertCrossFromCurvature(MeshType &mesh)
|
static void SetVertCrossFromCurvature(MeshType &mesh)
|
||||||
{
|
{
|
||||||
|
@ -110,7 +121,7 @@ namespace vcg {
|
||||||
|
|
||||||
///transform a given angle in tangent space wrt X axis of
|
///transform a given angle in tangent space wrt X axis of
|
||||||
///tangest space will return the corresponding 3D vector
|
///tangest space will return the corresponding 3D vector
|
||||||
static CoordType TangetAngleToVect(const FaceType &f,const ScalarType &angle)
|
static CoordType TangentAngleToVect(const FaceType &f,const ScalarType &angle)
|
||||||
{
|
{
|
||||||
///find 2D vector
|
///find 2D vector
|
||||||
vcg::Point2<ScalarType> axis2D=vcg::Point2<ScalarType>(cos(angle),sin(angle));
|
vcg::Point2<ScalarType> axis2D=vcg::Point2<ScalarType>(cos(angle),sin(angle));
|
||||||
|
@ -194,6 +205,19 @@ namespace vcg {
|
||||||
axis[3]=-dir1;
|
axis[3]=-dir1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///return the 4 direction in 3D of
|
||||||
|
///the cross field of a given face
|
||||||
|
static void CrossVector(const VertexType &v,
|
||||||
|
CoordType axis[4])
|
||||||
|
{
|
||||||
|
CoordType dir0=v.cPD1();
|
||||||
|
CoordType dir1=v.cPD2();
|
||||||
|
axis[0]=dir0;
|
||||||
|
axis[1]=dir1;
|
||||||
|
axis[2]=-dir0;
|
||||||
|
axis[3]=-dir1;
|
||||||
|
}
|
||||||
|
|
||||||
///return a specific direction given an integer 0..3
|
///return a specific direction given an integer 0..3
|
||||||
///considering the reference direction of the cross field
|
///considering the reference direction of the cross field
|
||||||
static CoordType CrossVector(const FaceType &f,
|
static CoordType CrossVector(const FaceType &f,
|
||||||
|
@ -205,6 +229,17 @@ namespace vcg {
|
||||||
return axis[index];
|
return axis[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///return a specific direction given an integer 0..3
|
||||||
|
///considering the reference direction of the cross field
|
||||||
|
static CoordType CrossVector(const VertexType &v,
|
||||||
|
const int &index)
|
||||||
|
{
|
||||||
|
assert((index>=0)&&(index<4));
|
||||||
|
CoordType axis[4];
|
||||||
|
CrossVector(f,axis);
|
||||||
|
return axis[index];
|
||||||
|
}
|
||||||
|
|
||||||
///set the cross field of a given face
|
///set the cross field of a given face
|
||||||
static void SetCrossVector(FaceType &f,
|
static void SetCrossVector(FaceType &f,
|
||||||
CoordType dir0,
|
CoordType dir0,
|
||||||
|
@ -243,6 +278,43 @@ namespace vcg {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///set the face cross vector from vertex one
|
||||||
|
static void SetVertCrossVectorFromFace(VertexType &v)
|
||||||
|
{
|
||||||
|
std::vector<FaceType *> faceVec;
|
||||||
|
vcg::face::VFStarVF(&v,faceVec);
|
||||||
|
std::vector<CoordType> TangVect;
|
||||||
|
std::vector<CoordType> Norms;
|
||||||
|
for (int i=0;i<faceVec.size();i++)
|
||||||
|
{
|
||||||
|
TangVect.push_back(faceVec[i]->PD1());
|
||||||
|
Norms.push_back(faceVec[i]->N());
|
||||||
|
}
|
||||||
|
std::vector<ScalarType> Weights(TangVect.size(),1.0/(ScalarType)TangVect.size());
|
||||||
|
CoordType NRef=v.N();
|
||||||
|
CoordType N0=faceVec[0]->N();
|
||||||
|
CoordType DirRef=faceVec[0]->PD1();
|
||||||
|
///find the rotation matrix that maps between normals
|
||||||
|
vcg::Matrix33<ScalarType> rotation=vcg::RotationMatrix(N0,NRef);
|
||||||
|
DirRef=rotation*DirRef;
|
||||||
|
|
||||||
|
CoordType tF1=InterpolateCrossField(TangVect,Weights,Norms,NRef,DirRef);
|
||||||
|
tF1.Normalize();
|
||||||
|
CoordType tF2=NRef^tF1;
|
||||||
|
tF2.Normalize();
|
||||||
|
v.PD1()=tF1;
|
||||||
|
v.PD2()=tF2;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void SetVertCrossVectorFromFace(MeshType &mesh)
|
||||||
|
{
|
||||||
|
for (int i=0;i<mesh.vert.size();i++)
|
||||||
|
{
|
||||||
|
VertexType *v=&mesh.vert[i];
|
||||||
|
if (v->IsD())continue;
|
||||||
|
SetVertCrossVectorFromFace(*v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
///rotate a given vector from the tangent space
|
///rotate a given vector from the tangent space
|
||||||
///of f0 to the tangent space of f1 by considering the difference of normals
|
///of f0 to the tangent space of f1 by considering the difference of normals
|
||||||
|
@ -420,7 +492,7 @@ namespace vcg {
|
||||||
|
|
||||||
///return true if a given vertex is singular,
|
///return true if a given vertex is singular,
|
||||||
///return also the missmatch
|
///return also the missmatch
|
||||||
static bool IsSingular(VertexType &v,int &missmatch)
|
static bool IsSingular(const VertexType &v,int &missmatch)
|
||||||
{
|
{
|
||||||
typedef typename VertexType::FaceType FaceType;
|
typedef typename VertexType::FaceType FaceType;
|
||||||
///check that is on border..
|
///check that is on border..
|
||||||
|
@ -500,7 +572,7 @@ namespace vcg {
|
||||||
// skip strange string line
|
// skip strange string line
|
||||||
while (fscanf(f,"%c",&c)!=EOF) if (c=='\n') break;
|
while (fscanf(f,"%c",&c)!=EOF) if (c=='\n') break;
|
||||||
for (int i=0; i<nnv; i++){
|
for (int i=0; i<nnv; i++){
|
||||||
vcg::Point3d u,v;
|
vcg::Point3<ScalarType> u,v;
|
||||||
int a,b;
|
int a,b;
|
||||||
if (fscanf(f,
|
if (fscanf(f,
|
||||||
"%d %d %lf %lf %lf %lf %lf %lf",
|
"%d %d %lf %lf %lf %lf %lf %lf",
|
||||||
|
|
Loading…
Reference in New Issue