Calculate average normal for poly mesh faces. Otherwise an arbitrary triangle is taken
git-svn-id: http://www.openmesh.org/svnrepo/OpenMesh/trunk@309 fdac6126-5c0c-442c-9429-916003d36597
This commit is contained in:
@@ -96,14 +96,36 @@ calc_face_normal(FaceHandle _fh) const
|
|||||||
assert(halfedge_handle(_fh).is_valid());
|
assert(halfedge_handle(_fh).is_valid());
|
||||||
ConstFaceVertexIter fv_it(cfv_iter(_fh));
|
ConstFaceVertexIter fv_it(cfv_iter(_fh));
|
||||||
|
|
||||||
const Point& p0(point(fv_it)); ++fv_it;
|
Point p0 = point(fv_it);
|
||||||
const Point& p1(point(fv_it)); ++fv_it;
|
Point p0i = p0; //save point of vertex 0
|
||||||
const Point& p2(point(fv_it));
|
++fv_it;
|
||||||
|
Point p1 = point(fv_it);
|
||||||
|
Point p1i = p1; //save point of vertex 1
|
||||||
|
++fv_it;
|
||||||
|
Point p2;
|
||||||
|
|
||||||
return calc_face_normal(p0, p1, p2);
|
//calculate area-weighted average normal of polygon's ears
|
||||||
|
Normal n(0,0,0);
|
||||||
|
for(; fv_it; ++fv_it)
|
||||||
|
{
|
||||||
|
p2 = point(fv_it);
|
||||||
|
n += vector_cast<Normal>((p2-p1)%(p0-p1));
|
||||||
|
p0 = p1;
|
||||||
|
p1 = p2;
|
||||||
|
}
|
||||||
|
|
||||||
|
//two additional steps since we started at vertex 2, not 0
|
||||||
|
n += vector_cast<Normal>((p0i-p1)%(p0-p1));
|
||||||
|
n += vector_cast<Normal>((p1i-p0i)%(p1-p0i));
|
||||||
|
|
||||||
|
typename Normal::value_type norm = n.length();
|
||||||
|
|
||||||
|
// The expression ((n *= (1.0/norm)),n) is used because the OpenSG
|
||||||
|
// vector class does not return self after component-wise
|
||||||
|
// self-multiplication with a scalar!!!
|
||||||
|
return (norm != typename Normal::value_type(0)) ? ((n *= (typename Normal::value_type(1)/norm)),n) : Normal(0,0,0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -218,7 +218,7 @@ public:
|
|||||||
void update_face_normals();
|
void update_face_normals();
|
||||||
|
|
||||||
/** Calculate normal vector for face _fh. */
|
/** Calculate normal vector for face _fh. */
|
||||||
Normal calc_face_normal(FaceHandle _fh) const;
|
virtual Normal calc_face_normal(FaceHandle _fh) const;
|
||||||
|
|
||||||
/** Calculate normal vector for face (_p0, _p1, _p2). */
|
/** Calculate normal vector for face (_p0, _p1, _p2). */
|
||||||
Normal calc_face_normal(const Point& _p0, const Point& _p1,
|
Normal calc_face_normal(const Point& _p0, const Point& _p1,
|
||||||
|
|||||||
@@ -66,6 +66,21 @@ namespace OpenMesh {
|
|||||||
|
|
||||||
//== IMPLEMENTATION ==========================================================
|
//== IMPLEMENTATION ==========================================================
|
||||||
|
|
||||||
|
template <class Kernel>
|
||||||
|
typename TriMeshT<Kernel>::Normal
|
||||||
|
TriMeshT<Kernel>::
|
||||||
|
calc_face_normal(FaceHandle _fh) const
|
||||||
|
{
|
||||||
|
assert(halfedge_handle(_fh).is_valid());
|
||||||
|
ConstFaceVertexIter fv_it(cfv_iter(_fh));
|
||||||
|
|
||||||
|
const Point& p0(point(fv_it)); ++fv_it;
|
||||||
|
const Point& p1(point(fv_it)); ++fv_it;
|
||||||
|
const Point& p2(point(fv_it));
|
||||||
|
|
||||||
|
return PolyMesh::calc_face_normal(p0, p1, p2);
|
||||||
|
}
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
} // namespace OpenMesh
|
} // namespace OpenMesh
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
|
|||||||
@@ -183,14 +183,21 @@ public:
|
|||||||
inline void split(EdgeHandle _eh, VertexHandle _vh)
|
inline void split(EdgeHandle _eh, VertexHandle _vh)
|
||||||
{ PolyMesh::split(_eh, _vh); }
|
{ PolyMesh::split(_eh, _vh); }
|
||||||
|
|
||||||
/// Face split (= 1-to-3 split, calls corresponding PolyMeshT function).
|
|
||||||
|
|
||||||
/// Face split (= 1-to-3 split, calls corresponding PolyMeshT function).
|
/// Face split (= 1-to-3 split, calls corresponding PolyMeshT function).
|
||||||
inline void split(FaceHandle _fh, const Point& _p)
|
inline void split(FaceHandle _fh, const Point& _p)
|
||||||
{ PolyMesh::split(_fh, _p); }
|
{ PolyMesh::split(_fh, _p); }
|
||||||
|
|
||||||
inline void split(FaceHandle _fh, VertexHandle _vh)
|
inline void split(FaceHandle _fh, VertexHandle _vh)
|
||||||
{ PolyMesh::split(_fh, _vh); }
|
{ PolyMesh::split(_fh, _vh); }
|
||||||
|
|
||||||
|
/** \name Normal vector computation
|
||||||
|
*/
|
||||||
|
//@{
|
||||||
|
|
||||||
|
/** Calculate normal vector for face _fh (specialized for TriMesh). */
|
||||||
|
Normal calc_face_normal(FaceHandle _fh) const;
|
||||||
|
|
||||||
|
//@}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user