From 0c61619049a3bfb787e06d857291854a41748db1 Mon Sep 17 00:00:00 2001 From: cignoni Date: Fri, 10 Apr 2009 15:05:49 +0000 Subject: [PATCH] Solved bug about aliasing when resampling with signed distance thin and long triangles. --- vcg/complex/trimesh/create/resampler.h | 35 +++++++++++++++++--------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/vcg/complex/trimesh/create/resampler.h b/vcg/complex/trimesh/create/resampler.h index 9f6a1310..f70fddd0 100644 --- a/vcg/complex/trimesh/create/resampler.h +++ b/vcg/complex/trimesh/create/resampler.h @@ -177,21 +177,31 @@ template V(0)->cN())*pip[0] + (f->V(1)->cN())*pip[1] + (f->V(2)->cN())*pip[2] ; - closestNormF = f->cN() ; - + const float InterpolationEpsilon = 0.00001f; + int zeroCnt=0; + if(pip[0] fabs(signF)) signBest = signV; - else signBest = signF; + if(zeroCnt>0) // we Not are in the middle of the face so the face normal is NOT reliable. + { + closestNormV = (f->V(0)->cN())*pip[0] + (f->V(1)->cN())*pip[1] + (f->V(2)->cN())*pip[2] ; + signBest = dir.dot(closestNormV) ; + } + else + { + closestNormF = f->cN() ; + signBest = dir.dot(closestNormF) ; + } if(signBest<0) dist=-dist; @@ -320,7 +330,8 @@ template ::PerVertexNormalizedPerFaceNormalized(old_mesh); + tri::UpdateNormals::PerFaceNormalized(old_mesh); + tri::UpdateNormals::PerVertexAngleWeighted(old_mesh); tri::UpdateFlags::FaceProjection(old_mesh); int _size=(int)old_mesh.fn*100;