First checkin for OpenMesh 2.0
git-svn-id: http://www.openmesh.org/svnrepo/OpenMesh/trunk@2 fdac6126-5c0c-442c-9429-916003d36597
This commit is contained in:
74
Doc/tutorial_06.docu
Normal file
74
Doc/tutorial_06.docu
Normal file
@@ -0,0 +1,74 @@
|
||||
/** \page tutorial_06 Using mesh attributes and traits
|
||||
|
||||
this example shows how to change the data type for positions, normals, colors, and texture,
|
||||
|
||||
In the previous tutorial (\ref tutorial_05) we learned to use standard
|
||||
properties by calling the appropriate \c request method.
|
||||
Unlike the custom properties, where the user specifies the
|
||||
data type by passing the type to the handle (e.g. \c
|
||||
MyMesh::FPropHandleT< <b>int</b>>), the data types of the standard
|
||||
properties are defined by so-called mesh traits. With traits we can
|
||||
customize and extend the mesh data structure. We can do this by
|
||||
changing two important features
|
||||
|
||||
-# changing data type for positions, normals, colors, and texture
|
||||
coordinates
|
||||
-# extend mesh entities Vertex, Face, Edge, and Halfedge
|
||||
(see tutorial '\ref tutorial_07')
|
||||
|
||||
Let's start. Every custom traits should derive from the default traits
|
||||
|
||||
\dontinclude 06-attributes/attributes.cc
|
||||
\skipline struct MyTraits
|
||||
|
||||
As mentioned, we can change the basic data types for the basic types
|
||||
\c MyMesh::Point, \c MyMesh::Normal, \c MyMesh::Color, and \c MyMesh::TexCoord.
|
||||
We can use the provided vector class or we use a
|
||||
different one from another library. Here we simply replace the default
|
||||
type \c OpenMesh::Vec3f (defined in the \c OpenMesh::DefaultTraits)
|
||||
for positions and normals with \c OpenMesh::Vec3d
|
||||
|
||||
\skipline Vec3d
|
||||
\skipline Vec3d
|
||||
|
||||
(In general it's better to have the same scalar type for the point and
|
||||
normal vector, for instance \c double in this case. Otherwise we have
|
||||
to cast quite a lot depending on the implementation of the vector class.)
|
||||
|
||||
Be aware that these settings overwrite the ones of the parent traits
|
||||
class! As we usually derive from the DefaultTraits let's have a close look.
|
||||
|
||||
Actually the struct \c OpenMesh::DefaultTraits is merely empty. It solely
|
||||
defines the types for \c Point, \c Normal, \c TexCoord, and \c Color
|
||||
and one attribute, that we used implicitly all the time:
|
||||
|
||||
\skipline HalfedgeAttributes
|
||||
|
||||
The attribute \c PrevHalfedge is different, as it does not control a
|
||||
property. Yet it has a great impact on the resulting mesh type, as it
|
||||
adds additional information to the halfedge structure. The impact
|
||||
is twofold:
|
||||
|
||||
-# fast access to previous halfedge
|
||||
-# increase of memory consumption
|
||||
|
||||
Using this feature depends highly on our needs. One situation where
|
||||
the previous halfedges are quite handy, is the mesh member function
|
||||
add_face(). The execution time for the member function drops
|
||||
dramatically, when the information about the previous halfedge is
|
||||
available. Usually we want to have this information. But if not, because we
|
||||
must save memory, we can easily remove it with
|
||||
|
||||
\skipline HalfedgeAttributes
|
||||
|
||||
Then we need 8 bytes less per edge, which can be quite a lot as one can
|
||||
derive from the Euler formula <b style="background-color:#FFFFFF;">(\f$V-E+F=2 (1-g)\f$)</b>, that for a regular
|
||||
triangle meshes with genus <b style="background-color:#FFFFFF;">\f$g=0\f$</b> the number of edges
|
||||
<b style="background-color:#FFFFFF;">\f$E\f$</b> is approximately
|
||||
three times the number of vertices <b style="background-color:#FFFFFF;">\f$V\f$: \f$ E \approx 3 \cdot V\f$</b>.
|
||||
|
||||
The complete source looks like this:
|
||||
|
||||
\include 06-attributes/attributes.cc
|
||||
|
||||
*/
|
||||
Reference in New Issue
Block a user