subdivision schemes basic idea: start with something coarse, and refine it into smaller pieces for...

27
Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering We have seen how subdivision may be used to render parametric curves and Bezier surfaces We will see how it can be used for modeling specific objects, and as a modeling scheme in itself In this lecture: Subdivision for tessellating a sphere, and implementation details Subdivision for fractal surfaces Subdivision for B-spline patches General subdivision surfaces

Upload: imogen-beasley

Post on 04-Jan-2016

217 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Subdivision Schemes• Basic idea: Start with something coarse, and refine it into

smaller pieces for rendering– We have seen how subdivision may be used to render parametric

curves and Bezier surfaces– We will see how it can be used for modeling specific objects, and as

a modeling scheme in itself

• In this lecture:– Subdivision for tessellating a sphere, and implementation details– Subdivision for fractal surfaces– Subdivision for B-spline patches– General subdivision surfaces

Page 2: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Tessellating a Sphere• Spheres are best parameterized in polar

coordinates:

– Note the singularity at the poles

• Tessellation: The process of approximating a surface with a polygon mesh

• One option for tessellating a sphere:– Step around and up the sphere in constant steps of and

– Problem: Polygons are of wildly different sizes, and

some vertices have very high degree

22 ,20

sin ,cossin ,coscos

zyx

Page 3: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Subdivision Method• Begin with a course approximation to the sphere,

that uses only triangles– Two good candidates are platonic solids with triangular

faces: Octahedron, Isosahedron– They have uniformly sized faces and uniform vertex

degree

• Repeat the following process:– Insert a new vertex in the middle of each edge– Push the vertices out to the surface of the sphere– Break each triangular face into 4 triangles using the new

vertices

Octahedron

Isosahedron

Page 4: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

The First Stage

Each face gets split into 4:Each new vertex is degree 6, original vertices are degree 4

Page 5: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Sphere Subdivision Advantages• All the triangles at any given level are the same size

– Relies on the initial mesh having equal sized faces, and properties of the sphere

• The new vertices all have the same degree– Mesh is uniform in newly generated areas

– This is a property we will see later in subdivision surfaces

– Makes it easier to analyze what happens to the surface

• The location and degree of existing vertices does not change– The only extraordinary points lie on the initial mesh

Page 6: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Fractal Surfaces

• Fractals are objects that show self similarity– The word is overloaded – it can also mean other things

• Landscapes and coastlines are considered fractal in nature– Mountains have hills on them that have rocks on them and so on

– Continents have gulfs that have harbors that have bays and so on

• Subdivision is the natural way of building fractal surfaces– Start with coarse features, Subdivide to finer features

– Different types of fractals come from different subdivision schemes and different parameters to those schemes

Page 7: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Fractal Terrain (1)• Start with a coarse mesh

– Vertices on this mesh won’t move, so they can be used to set mountain peaks and valleys

– Also defines the boundary– Mesh must not have dangling edges or vertices

• Every edge and every vertex must be part of a face

• Also define an “up” direction• Then repeatedly:

– Add new vertices at the midpoint of each edge, and randomly push them up or down

– Split each face into four, as for the sphere

Page 8: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Fractal Terrain Example

A mountainside

Page 9: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Fractal Terrain Details• There are options for choosing where to move the new

vertices– Uniform random offset

– Normally distributed offset – small motions more likely

– Procedural rule – eg Perlin noise

• Scaling the offset of new points according to the subdivision level is essential– For the subdivision to converge to a smooth surface, the offset

must be reduced for each level

• Colors are frequently chosen based on “altitude”

Page 10: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Fractal Terrains

http://members.aol.com/maksoy/vistfrac/sunset.htm

Page 11: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Terrain, clouds generated using procedural textures and Perlin noisehttp://www.planetside.co.uk/ -- tool is called Terragen

Page 12: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Terrain, clouds generated using procedural textures and Perlin noisehttp://www.planetside.co.uk/ -- tool is called Terragen

Page 13: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Terrain, clouds generated using procedural textures and Perlin noisehttp://www.planetside.co.uk/ -- tool is called Terragen

Page 14: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Implementing Subdivision (1)• We must represent a polygon mesh

• Basic operations:– Split an edge, creating a new vertex

– Split a face, creating new edges and new faces based on the old edges and the old and new vertices

• Questions influencing the data structures:– Should we store edges explicitly?

– Should faces know about their edges?

– How do we access the required information when performing the basic operations?

Page 15: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Implementing Subdivision (2)• Split an edge, create a new vertex and

two new edges– Each edge must be split exactly once– Need to know endpoints of edge to create

new vertex

• Split a face, creating new edges and new faces based on the old edges and the old and new vertices– Require knowledge of which new edges to

use– Require knowledge of new vertex locations

• Note: Everything works from edges!

Page 16: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Implementing Subdivision (3)• Should we explicitly store edges? Yes!

– Easy to step through all edges and split them– Each edge can store the edges that will replace it– Each face can point to its edges, so it knows the location of new

vertices and edges

• What does each vertex need to store?• What does each edge need to store?• What does each face need to store?• Answers are in C, but converting to C++ classes is easy

Page 17: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Vertex Data• Vertices need to know where they are, and they will be

copied as part of the algorithm• For rendering, may want:

– Per-vertex normals: Compute at the end by averaging normals from faces that share the vertex

– Texture coordinates

struct Vertex {float x[3];float t[2];float n[3];int num_faces;

}

Page 18: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Edge Data• Need to know endpoints, new vertex when split, and new

edges when split– Store pointers as indexes into a list

• Also want to identify boundary edges, which should not have vertices perturbed when split

struct Edge {int v_start; // Index of start vertexint v_end; // Index of end vertexint v_new; // Index of new vertexint e_start; // Index of one sub-edgeint e_end; // Index of other sub-edgebool boundary;

}

Page 19: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Face Data• Faces are triangles that need to know:

– Edges, in a fixed order for rendering• Complication: Some edges point forward around the face,

some point backwards. Store this info.

– Normals, for rendering or computing vertex normals• Compute at the end

struct Face {int edges[3];bool forward[3];float n[3];

}

Page 20: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Mesh Data Structure• Mesh stores:

– Vertices, edges and faces– The up direction for offsetting verticesstruct Mesh {

int num_vertices;struct Vertex *vertices;int num_edges;struct Edge *edges;int num_faces;struct Face *faces;float up[3];

}

Page 21: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Fractal Terrain Algorithm• The hard part is keeping track of all the indices and other data• Same algorithm works for subdividing sphere

Split_One_Level(struct Mesh terrain)Copy old verticesfor all edges

Create and store new vertexCreate and store new edges

for all facesCreate new edges interior to faceCreate new faces

Replace old vertices, edges and faces

Page 22: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

General Subdivision Schemes• Subdivision schemes can also be used where there is no

“target” surface• They aim to replace a polygonal mesh with a smooth

surface that approximates the coarse mesh• There are many schemes:

– Butterfly scheme (for triangular meshes)– Catmull-Clark subdivision (for mostly rectangular meshes,

converges to B-splines in uniform regions)– Loop’s scheme (for triangular meshes)– Modified butterfly scheme (for triangular meshes)– Many more…

Page 23: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Butterfly Scheme• Subdivides the same way we have been discussing

– Each edge is split– Each face is split into four

• Rules are defined for computing the splitting vertex of each edge

• Basic rule for a uniform region– Splitting an edge with endpoints that have degree 6– As before, all new interior vertices will have degree 6– Take a weighted sum of the neighboring vertices– Weights define rules

• http://www.gamasutra.com/features/20000411/sharp_01.htm

Page 24: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Butterfly Scheme (1)

a a

b

b cc

c c

dd

wd

wc

wb

wa

:16

1:

28

1:

2

1:

:Weights

•Multiply each vertex by its weight and sum them up•w is a control parameter – determines how closely the shape conforms to the original mesh

Page 25: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Modified Butterfly Scheme• The butterfly scheme must be modified to deal with

edges with an endpoint of degree 6• In that case, compute new vertex based only the

neighbors of the extraordinary vertex• If an edge has two extraordinary endpoints, average the

results from each endpoint to get the new endpoint• The modified butterfly scheme is provably continuous

about extraordinary vertices– Proof formulates subdivision as a matrix operator and does

eigen-analysis of subdivision matrix

Page 26: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Modified Butterfly Scheme

v e0

e1

e2e3

eN-1

eN-2eN-3

N

j

N

j

NevN

eeeevN

eeevN

j

4cos

2

12cos

4

11:,

4

3::5

0:,8

1:,0:,

8

3:,

4

3::4

12

1:,

12

1:,

12

5:,

4

3::3

:Weights

3210

210

Page 27: Subdivision Schemes Basic idea: Start with something coarse, and refine it into smaller pieces for rendering –We have seen how subdivision may be used

Modified Butterfly Example• Notes:

– The mesh is uniform everywhere except the original vertices

– It interpolates the original vertices

– It has smoothed out the underlying mesh