Commit fcf67890 authored by Hui Wang's avatar Hui Wang
Browse files

update meshedit doc

parent 749b43d2
[[Home]](../index) [[Mesh Edit]](../meshedit/overview) [[Path Tracer]](../pathtracer/overview) [[Animation]](../animation/overview) [[Home]](/docs/index.md) [[Mesh Edit]](/docs/meshedit/overview.md) [[Path Tracer]](/docs/pathtracer/overview.md) [[Animation]](/docs/animation/overview.md)
--- ---
...@@ -13,7 +14,7 @@ The methods that update the connectivity are `HalfedgeMesh::bevel_vertex`, `half ...@@ -13,7 +14,7 @@ The methods that update the connectivity are `HalfedgeMesh::bevel_vertex`, `half
`HalfedgeMesh::extrude_vertex` will update both connectivity and geometry, as it should first perform a flat bevel on the vertex, and then insert a vertex into the new face. TODO: not used in stanford `HalfedgeMesh::extrude_vertex` will update both connectivity and geometry, as it should first perform a flat bevel on the vertex, and then insert a vertex into the new face. TODO: not used in stanford
The methods for updating connectivity can be implemented following the general strategy outlined in [edge flip tutorial](./edge_flip). **Note that the methods that update geometry will be called repeatedly for the same bevel, in order to adjust positions according to user mouse input. See the gif in the [User Guide](../guide/model).** The methods for updating connectivity can be implemented following the general strategy outlined in [edge flip tutorial](/docs/meshedit/edge_flip.md). **Note that the methods that update geometry will be called repeatedly for the same bevel, in order to adjust positions according to user mouse input. See the gif in the [User Guide](/docs/guide/model.md).**
To update the _geometry_ of a beveled element, you are provided with the following data: To update the _geometry_ of a beveled element, you are provided with the following data:
......
[[Home]](../index) [[Mesh Edit]](../meshedit/overview) [[Path Tracer]](../pathtracer/overview) [[Animation]](../animation/overview) [[Home]](/docs/index.md) [[Mesh Edit]](/docs/meshedit/overview.md) [[Path Tracer]](/docs/pathtracer/overview.md) [[Animation]](/docs/animation/overview.md)
--- ---
# Catmull-Clark Subdivision # Catmull-Clark Subdivision
For an in-practice example, see the [User Guide](../guide/model). For an in-practice example, see the [User Guide](/docs/guide/model.md).
The only difference between Catmull-Clark and [linear](./linear) subdivision is the choice of positions for new vertices. Whereas linear subdivision simply takes a uniform average of the old vertex positions, Catmull-Clark uses a very carefully-designed _weighted_ average to ensure that the surface converges to a nice, round surface as the number of subdivision steps increases. The original scheme is described in the paper _"Recursively generated B-spline surfaces on arbitrary topological meshes"_ by (Pixar co-founder) Ed Catmull and James Clark. Since then, the scheme has been thoroughly discussed, extended, and analyzed; more modern descriptions of the algorithm may be easier to read, including those from the [Wikipedia](https://en.wikipedia.org/wiki/Catmull-Clark_subdivision_surface) and [this webpage](http://www.rorydriscoll.com/2008/08/01/catmull-clark-subdivision-the-basics/). In short, the new vertex positions can be calculated by: The only difference between Catmull-Clark and [linear](/docs/meshedit/linear.md) subdivision is the choice of positions for new vertices. Whereas linear subdivision simply takes a uniform average of the old vertex positions, Catmull-Clark uses a very carefully-designed _weighted_ average to ensure that the surface converges to a nice, round surface as the number of subdivision steps increases. The original scheme is described in the paper _"Recursively generated B-spline surfaces on arbitrary topological meshes"_ by (Pixar co-founder) Ed Catmull and James Clark. Since then, the scheme has been thoroughly discussed, extended, and analyzed; more modern descriptions of the algorithm may be easier to read, including those from the [Wikipedia](https://en.wikipedia.org/wiki/Catmull-Clark_subdivision_surface) and [this webpage](http://www.rorydriscoll.com/2008/08/01/catmull-clark-subdivision-the-basics/). In short, the new vertex positions can be calculated by:
1. setting the new vertex position at each face f to the average of all its original vertices (exactly as in linear subdivision), 1. setting the new vertex position at each face f to the average of all its original vertices (exactly as in linear subdivision),
2. setting the new vertex position at each edge e to the average of the new face positions (from step 1) and the original endpoint positions, and 2. setting the new vertex position at each edge e to the average of the new face positions (from step 1) and the original endpoint positions, and
......
[[Home]](../index) [[Mesh Edit]](../meshedit/overview) [[Path Tracer]](../pathtracer/overview) [[Animation]](../animation/overview) [[Home]](/docs/index.md) [[Mesh Edit]](/docs/meshedit/overview.md) [[Path Tracer]](/docs/pathtracer/overview.md) [[Animation]](/docs/animation/overview.md)
--- ---
......
[[Home]](../index) [[Mesh Edit]](../meshedit/overview) [[Path Tracer]](../pathtracer/overview) [[Animation]](../animation/overview) [[Home]](/docs/index.md) [[Mesh Edit]](/docs/meshedit/overview.md) [[Path Tracer]](/docs/pathtracer/overview.md) [[Animation]](/docs/animation/overview.md)
--- ---
# Global Mesh Operations # Global Mesh Operations
In addition to local operations on mesh connectivity, Scotty3D provides several global remeshing operations (as outlined in the [User Guide](../guide/model)). Two different mechanisms are used to implement global operations: In addition to local operations on mesh connectivity, Scotty3D provides several global remeshing operations (as outlined in the [User Guide](/docs/guide/model.md)). Two different mechanisms are used to implement global operations:
* _Repeated application of local operations._ Some mesh operations are most easily expressed by applying local operations (edge flips, etc.) to a sequence of mesh elements until the target output is achieved. A good example is [mesh simplification](./simplify), which is a greedy algorithm that collapses one edge at a time. * _Repeated application of local operations._ Some mesh operations are most easily expressed by applying local operations (edge flips, etc.) to a sequence of mesh elements until the target output is achieved. A good example is [mesh simplification](/docs/meshedit/simplify.md), which is a greedy algorithm that collapses one edge at a time.
* _Global replacement of the mesh._ Other mesh operations are better expressed by temporarily storing new mesh elements in a simpler mesh data structure (e.g., an indexed list of faces) and completely re-building the halfedge data structure from this data. A good example is [Catmull-Clark subdivision](./catmull), where every polygon must be simultaneously split into quadrilaterals. * _Global replacement of the mesh._ Other mesh operations are better expressed by temporarily storing new mesh elements in a simpler mesh data structure (e.g., an indexed list of faces) and completely re-building the halfedge data structure from this data. A good example is [Catmull-Clark subdivision](/docs/meshedit/catmull.md), where every polygon must be simultaneously split into quadrilaterals.
Note that in general there are no inter-dependencies among global remeshing operations (except that some of them require a triangle mesh as input, which can be achieved via the method `Halfedge_Mesh::triangulate`). Note that in general there are no inter-dependencies among global remeshing operations (except that some of them require a triangle mesh as input, which can be achieved via the method `Halfedge_Mesh::triangulate`).
...@@ -18,7 +18,7 @@ In image processing, we often have a low resolution image that we want to displa ...@@ -18,7 +18,7 @@ In image processing, we often have a low resolution image that we want to displa
In geometry processing, one encounters the same situation: we may have a low-resolution polygon mesh that we wish to upsample for display, simulation, etc. Simply splitting each polygon into smaller pieces doesn't help, because it does nothing to alleviate blocky silhouettes or chunky features. Instead, we need an upsampling scheme that nicely interpolates or approximates the original data. Polygon meshes are quite a bit trickier than images, however, since our sample points are generally at _irregular_ locations, i.e., they are no longer found at regular intervals on a grid. In geometry processing, one encounters the same situation: we may have a low-resolution polygon mesh that we wish to upsample for display, simulation, etc. Simply splitting each polygon into smaller pieces doesn't help, because it does nothing to alleviate blocky silhouettes or chunky features. Instead, we need an upsampling scheme that nicely interpolates or approximates the original data. Polygon meshes are quite a bit trickier than images, however, since our sample points are generally at _irregular_ locations, i.e., they are no longer found at regular intervals on a grid.
Three subdivision schemes are supported by Scotty3D: [Linear](./linear), [Catmull-Clark](./catmull), and [Loop](./loop). The first two can be used on any polygon mesh without boundary, and should be implemented via the global replacement strategy described above. Loop subdivision can be implemented using repeated application of local operations. For further details, see the linked pages. Three subdivision schemes are supported by Scotty3D: [Linear](/docs/meshedit/linear.md), [Catmull-Clark](/docs/meshedit/catmull.md), and [Loop](/docs/meshedit/loop.md). The first two can be used on any polygon mesh without boundary, and should be implemented via the global replacement strategy described above. Loop subdivision can be implemented using repeated application of local operations. For further details, see the linked pages.
## Performance ## Performance
......
[[Home]](../index) [[Mesh Edit]](../meshedit/overview) [[Path Tracer]](../pathtracer/overview) [[Animation]](../animation/overview) [[Home]](/docs/index.md) [[Mesh Edit]](/docs/meshedit/overview.md) [[Path Tracer]](/docs/pathtracer/overview.md) [[Animation]](/docs/animation/overview.md)
--- ---
......
[[Home]](../index) [[Mesh Edit]](../meshedit/overview) [[Path Tracer]](../pathtracer/overview) [[Animation]](../animation/overview) [[Home]](/docs/index.md) [[Mesh Edit]](/docs/meshedit/overview.md) [[Path Tracer]](/docs/pathtracer/overview.md) [[Animation]](/docs/animation/overview.md)
--- ---
# Linear Subdivision # Linear Subdivision
For an in-practice example, see the [User Guide](../guide/model). For an in-practice example, see the [User Guide](/docs/guide/model.md).
Unlike most other global remeshing operations, linear (and Catmull-Clark) subdivision will proceed by completely replacing the original halfedge mesh with a new one. The high-level procedure is: Unlike most other global remeshing operations, linear (and Catmull-Clark) subdivision will proceed by completely replacing the original halfedge mesh with a new one. The high-level procedure is:
......
[[Home]](../index) [[Mesh Edit]](../meshedit/overview) [[Path Tracer]](../pathtracer/overview) [[Animation]](../animation/overview) [[Home]](/docs/index.md) [[Mesh Edit]](/docs/meshedit/overview.md) [[Path Tracer]](/docs/pathtracer/overview.md) [[Animation]](/docs/animation/overview.md)
--- ---
...@@ -22,7 +22,7 @@ To facilitate user interaction, as well as global mesh processing operations (de ...@@ -22,7 +22,7 @@ To facilitate user interaction, as well as global mesh processing operations (de
Also, remember that in any case, _the program should not crash!_ So for instance, you should never return a pointer to an element that was deleted. Also, remember that in any case, _the program should not crash!_ So for instance, you should never return a pointer to an element that was deleted.
See the [User Guide](../guide/model) for demonstrations of each local operation. See the [User Guide](/docs/guide/model.md) for demonstrations of each local operation.
* `Halfedge_Mesh::flip_edge` - should return the edge that was flipped * `Halfedge_Mesh::flip_edge` - should return the edge that was flipped
......
[[Home]](../index) [[Mesh Edit]](../meshedit/overview) [[Path Tracer]](../pathtracer/overview) [[Animation]](../animation/overview) [[Home]](/docs/index.md) [[Mesh Edit]](/docs/meshedit/overview.md) [[Path Tracer]](/docs/pathtracer/overview.md) [[Animation]](/docs/animation/overview.md)
--- ---
# Loop Subdivision # Loop Subdivision
For an in-practice example, see the [User Guide](../guide/model). For an in-practice example, see the [User Guide](/docs/guide/model.md).
Loop subdivision (named after [Charles Loop](http://charlesloop.com/)) is a standard approximating subdivision scheme for triangle meshes. At a high level, it consists of two basic steps: Loop subdivision (named after [Charles Loop](http://charlesloop.com/)) is a standard approximating subdivision scheme for triangle meshes. At a high level, it consists of two basic steps:
......
[[Home]](../index) [[Mesh Edit]](../meshedit/overview) [[Path Tracer]](../pathtracer/overview) [[Animation]](../animation/overview) [[Home]](/docs/index.md) [[Mesh Edit]](/docs/meshedit/overview.md) [[Path Tracer]](/docs/pathtracer/overview.md) [[Animation]](/docs/animation/overview.md)
--- ---
...@@ -11,16 +11,16 @@ The `media/` subdirectory of the project contains a variety of meshes and scenes ...@@ -11,16 +11,16 @@ The `media/` subdirectory of the project contains a variety of meshes and scenes
The following sections contain guidelines for implementing the functionality of MeshEdit: The following sections contain guidelines for implementing the functionality of MeshEdit:
- [Halfedge Mesh](./halfedge) - [Halfedge Mesh](/docs/meshedit/halfedge.md)
- [Local Mesh Operations](./local) - [Local Mesh Operations](/docs/meshedit/local.md)
- [Tutorial: Edge Flip](./edge_flip) - [Tutorial: Edge Flip](/docs/meshedit/edge_flip.md)
- [Beveling](./bevel) - [Beveling](/docs/meshedit/bevel.md)
- [Global Mesh Operations](./global) - [Global Mesh Operations](/docs/meshedit/global.md)
- [Triangulation](./triangulate) - [Triangulation](/docs/meshedit/triangulate.md)
- [Linear Subdivision](./linear) - [Linear Subdivision](/docs/meshedit/linear.md)
- [Catmull-Clark Subdivision](./catmull) - [Catmull-Clark Subdivision](/docs/meshedit/catmull.md)
- [Loop Subdivision](./loop) - [Loop Subdivision](/docs/meshedit/loop.md)
- [Isotropic Remeshing](./remesh) - [Isotropic Remeshing](/docs/meshedit/remesh.md)
- [Simplification](./simplify) - [Simplification](/docs/meshedit/simplify.md)
As always, be mindful of the [project philosophy](../index). As always, be mindful of the [project philosophy](/docs/index.md).
[[Home]](../index) [[Mesh Edit]](../meshedit/overview) [[Path Tracer]](../pathtracer/overview) [[Animation]](../animation/overview) [[Home]](/docs/index.md) [[Mesh Edit]](/docs/meshedit/overview.md) [[Path Tracer]](/docs/pathtracer/overview.md) [[Animation]](/docs/animation/overview.md)
--- ---
# Isotropic Remeshing # Isotropic Remeshing
For an in-practice example, see the [User Guide](../guide/model). For an in-practice example, see the [User Guide](/docs/guide/model.md).
Scotty3D also supports remeshing, an operation that keeps the number of samples roughly the same while improving the shape of individual triangles. The isotropic remeshing algorithm tries to make the mesh as "uniform" as possible, i.e., triangles as close as possible to equilateral triangles of equal size, and vertex degrees as close as possible to 6 (note: this algorithm is for **triangle meshes only**). The algorithm to be implemented is based on the paper [Botsch and Kobbelt, "A Remeshing Approach to Multiresolution Modeling"](https://www.graphics.rwth-aachen.de/media/papers/remeshing1.pdf) (Section 4), and can be summarized in just a few simple steps: Scotty3D also supports remeshing, an operation that keeps the number of samples roughly the same while improving the shape of individual triangles. The isotropic remeshing algorithm tries to make the mesh as "uniform" as possible, i.e., triangles as close as possible to equilateral triangles of equal size, and vertex degrees as close as possible to 6 (note: this algorithm is for **triangle meshes only**). The algorithm to be implemented is based on the paper [Botsch and Kobbelt, "A Remeshing Approach to Multiresolution Modeling"](https://www.graphics.rwth-aachen.de/media/papers/remeshing1.pdf) (Section 4), and can be summarized in just a few simple steps:
......
[[Home]](../index) [[Mesh Edit]](../meshedit/overview) [[Path Tracer]](../pathtracer/overview) [[Animation]](../animation/overview) [[Home]](/docs/index.md) [[Mesh Edit]](/docs/meshedit/overview.md) [[Path Tracer]](/docs/pathtracer/overview.md) [[Animation]](/docs/animation/overview.md)
--- ---
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
![Surface simplification via quadric error metric](./global/simplify/quad_simplify.png) ![Surface simplification via quadric error metric](./global/simplify/quad_simplify.png)
For an in-practice example, see the [User Guide](../guide/model). For an in-practice example, see the [User Guide](/docs/guide/model.md).
Just as with images, meshes often have far more samples than we really need. The simplification method in Scotty3D simplifies a given triangle mesh by applying _quadric error simplification_ (note that this method is for **triangle meshes only**!). This method was originally developed at CMU by Michael Garland and Paul Heckbert, in their paper [Surface Simplification Using Quadric Error Metrics](http://www.cs.cmu.edu/~./garland/quadrics/quadrics.html). (Looking at this paper -- or the many slides and presentations online that reference it -- may be very helpful in understanding and implementing this part of the assignment!) Just as with images, meshes often have far more samples than we really need. The simplification method in Scotty3D simplifies a given triangle mesh by applying _quadric error simplification_ (note that this method is for **triangle meshes only**!). This method was originally developed at CMU by Michael Garland and Paul Heckbert, in their paper [Surface Simplification Using Quadric Error Metrics](http://www.cs.cmu.edu/~./garland/quadrics/quadrics.html). (Looking at this paper -- or the many slides and presentations online that reference it -- may be very helpful in understanding and implementing this part of the assignment!)
......
[[Home]](../index) [[Mesh Edit]](../meshedit/overview) [[Path Tracer]](../pathtracer/overview) [[Animation]](../animation/overview) [[Home]](/docs/index.md) [[Mesh Edit]](/docs/meshedit/overview.md) [[Path Tracer]](/docs/pathtracer/overview.md) [[Animation]](/docs/animation/overview.md)
--- ---
# Triangulation # Triangulation
For an in-practice example, see the [User Guide](../guide/model). For an in-practice example, see the [User Guide](/docs/guide/model.md).
A variety of geometry processing algorithms become easier to implement (or are only well defined) when the input consists purely of triangles. The method `Halfedge_Mesh::triangulate` converts any polygon mesh into a triangle mesh by splitting each polygon into triangles. A variety of geometry processing algorithms become easier to implement (or are only well defined) when the input consists purely of triangles. The method `Halfedge_Mesh::triangulate` converts any polygon mesh into a triangle mesh by splitting each polygon into triangles.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment