This project explores ways in which global and local changes can be made on subdivision surfaces by adding offset values to vertices at various levels in the subdivision. For instance, one can make edits to the overall shape of the object by adjusting vertices on the control mesh of an early subdivision step and small local details can be created by adjusting vertex positions at later subdivision stages. A GUI is provided to interface with the algorithm and assist in the free-form modeling of objects.
Building with Delta Edits:
The process of modeling a surface with delta edits on subdivision surfaces leads to a process of free-form modeling. Having real-time feedback was crucial in visually constructing a surface and making interesting new forms. What I particularly enjoyed about the application was the ability to model surfaces that mimicked the shapes and properties of clay. Freedom in the ability to make delta edits leads to a freedom to form shapes in an improvisational fashion, leaving room for unexpected results and surprises to arise. In the figure above I outline the process of constructing a shape using the GUI and algorithm I developed.
In reference to the image above: a) the original mesh is loaded. b) a point is selected along the original mesh. c) the point is adjusted using the delta sliders. d) symmetry mode is enabled. e) a face is selected for a symmetry operation. f) symmetry mode is turned off. g) a point is selected and the symmetric point is automatically selected as well. h) the points are adjusted by augmenting the value along the normal. i, j) a second and third point is selected and adjusted along the normal. k) the “Hide Limit Mesh” button is pressed making the control mesh opaque in order to ease selection. l) A finishing touch is added.
Charles Loop described the subdivision scheme implemented in this project in detail in his thesis entitled, “Smooth Subdivision Surfaces Based on Triangles.” Given a triangle mesh as an .obj file, the program reads the input and constructs an initial mesh. To construct the levels of subdivision, the program copies the previous level mesh, subdivides according to Loop’s rules, and then offsets any vertices by “Delta,” and updates data associated with the mesh (vertex normal, face normals, etc). A “Delta” object stores the offset of the vertex as an x,y,z position. When a vertex is offset by its normal, the x,y,z position is derived by multiplying the magnitude of movement along the normal by the normalized vertex normal.
A class entitled “MeshManager” stores a pointer to a mesh at every level of subdivision. When delta edits are added to the control mesh at stage X, the MeshManager updates all subdivisions for stages later than X. Currently, this step proceeds by calling the subdivision process over again with the new point positions but it could be accomplished more efficiently by constructing a dependency graph between vertices at varying levels of the subdivision.
When a user defines a plane of symmetry, the face normal of the selected face is used as a plane of reflection. All points in the mesh and not on the plane are reflected across the plane. The mesh stores an adjacency list of vertices in the original mesh to the corresponding vertex on the symmetric mesh. Using this information, faces are defined by adding faces that are mirrors to the original faces and adjusted to maintain a counter-clockwise orientation. The face and vertex data of the symmetric mesh run through a function that constructs adjacency information for vertices and faces.
To support open meshes, slight adaptations were made to Loop’s rules. I use the same formulation for positioning vertices. In the case where the number of incident edges is 3, the mesh shows some visible warping which can be offset by a delta change (see figure 2). To place a vertex along an edge that is on a boundary, the new vertex position is obtained by using the existing faces information in place of the missing face. In practice, this didn’t lead to any noticeable deformations in the mesh.
Each of the user interface elements is explained below and shown in the image above:
- Limit Surface: The limit surface shows the final form the shape will take on after 5 subdivisions. This is the model that can be exported and printed on a 3D printer.
- Control Mesh: The control mesh represents the mesh at some user-defined level of subdivision. The user selects points on this control mesh in order to manipulate the limit surface.
- Subdivision Selector: moving this number between 0 and 5 will reveal what the mesh looked like at that particular subdivision step. At each subdivision step, the user can select points on the control mesh to adjust the shape of the limit surface.
- Delta Adjustors: These sliders allow the user to move a selected vertex or vertices along the X,Y, and Z axis. The colors of the sliders correspond to the color of axis that is visualized on to selected points. An additional slider allows the user to move the point along the vertex normal.
- XYZ Scaling: Adjusting values in the X, Y, Z scaling boxes allows one to globally scale the model in the X, Y or Z direction according to the value selected in the number selector box.
- Proportional Scaling: If one wishes to scale the shape evenly in all dimensions, they can click the box labeled “Sync” in order to make all of the scaling values the same and proportionally scale the mesh.
- Symmetry Mode: If the symmetry mode button is checked the then control mesh visualization changes to allow the user to select a face. Faces that are neighbors and co-planar will automatically be selected along with the selected face. Selecting a face in symmetry mode mirrors the mesh across the plane defined by the face normal. The symmetry operation is intended to take place before other delta edits. After a plane of symmetry has been defined, the program will ensure that if one vertex is selected, it’s symmetric vertex or vertices are also selected.
- Hide Control Mesh: Clicking this button will hide the control mesh allowing the user to visualize and inspect only the limit surface.
- Hide Limit Mesh: Clicking this button will hide the limit surface so that the user can see the control mesh more clearly. This is helpful in scenarios where the limit mesh occludes the control mesh. In order to visualize the structure of the control mesh more clearly and assist in point selection, the triangles of the control mesh are drawn to be opaque when the limit surface is not being rendered.
- Export OBJ: Clicking the export .obj button exports a file representing the limit surface in obj format.
- Mouse Controls: The user can drag the mouse in order to move the camera around the object. If one drags the mouse while the right click button is depressed, the camera will zoom in and out of the scene. To select vertices to adjust, the user can hover and click over vertices in the control mesh. Using the delta adjustors, they can modify and visualize the mesh as they do so. To deselect vertices, one can hit click on a selected vertex to deselect it.
- Key Commands: Pressing the ‘x’ key will automatically deselect all vertices.