subdivision surfaces 1 subdivision curves start with a piecewise - - PowerPoint PPT Presentation

subdivision surfaces
SMART_READER_LITE
LIVE PREVIEW

subdivision surfaces 1 subdivision curves start with a piecewise - - PowerPoint PPT Presentation

subdivision surfaces 1 subdivision curves start with a piecewise linear curve apply recursively subdivision rule [Zorin and Schrder, 2000] 2 subdivision surfaces start with polygon mesh apply recursively subdivision rule [Zorin and


slide-1
SLIDE 1

subdivision surfaces

1

slide-2
SLIDE 2

subdivision curves

start with a piecewise linear curve apply recursively subdivision rule

[Zorin and Schröder, 2000]

2

slide-3
SLIDE 3

subdivision surfaces

start with polygon mesh apply recursively subdivision rule

[Zorin and Schröder, 2000]

3

slide-4
SLIDE 4

subdivision surfaces

subdiv.: limit surface of subdivision process provably smooth subdivision process start with input mesh recursively apply subdivision rule : limit surface:

[DeRose et al.,1998] [DeRose et al.,1998]

M0 f = f( ) Mi+1 Mi S = = ( ) limi→∞ Mi limi→∞ f i M0

4

slide-5
SLIDE 5

subdivision surfaces

two stages: (1) refine mesh (2) place vertices mesh subdivision: new topology create new vertices and faces vertex placement: new geometry compute vertex position

5

slide-6
SLIDE 6

subdivision surfaces

different schemes available depend on input/output topology and geometry Catmull-Clark: quads meshes Loop: triangle meshes

6

slide-7
SLIDE 7

catmull-clark step

mesh subdivision: each quad is split in four quads

[Zorin and Schröder, 2000]

7

slide-8
SLIDE 8

catmull-clark step

vertex placement: depends on where vertex originated

[Zorin and Schröder, 2000]

8

slide-9
SLIDE 9

loop step

mesh subdivision: each triangle is split in four triangle

[Zorin and Schröder, 2000]

9

slide-10
SLIDE 10

loop step

vertex placement: depends on where vertex originated

[Zorin and Schröder, 2000]

10

slide-11
SLIDE 11

loop vs. catmull-clark

Loop Catmull-Clark [Zorin and Schröder, 2000]

11

slide-12
SLIDE 12

loop vs. catmull-clark

Loop Catmull-Clark [Zorin and Schröder, 2000]

12

slide-13
SLIDE 13

loop vs. catmull-clark

Base Loop Catmull-Clark [Zorin and Schröder, 2000]

13

slide-14
SLIDE 14

loop vs. catmull-clark

Loop Catmull-Clark [Zorin and Schröder, 2000]

14

slide-15
SLIDE 15

editing

manipulate original mesh while display subdiv local control

15

slide-16
SLIDE 16

editing

creases: can mark edges to be creased (subdivide as border)

16

slide-17
SLIDE 17

editing

creases: can mark vertices to be creased (do not move them)

17

slide-18
SLIDE 18

editing

creases: can mark both edges and vertices

18

slide-19
SLIDE 19

(c) Pixar/Disney

subdiv usage

heavily used in Computer Graphics

  • ld algorithms but practicalities

introduced recently works well with animation arbitrary topology, no stitching Pixar’s Geri’s Game 1998 Catmull-Clark subdiv complex control mesh heavy use of creases

19

slide-20
SLIDE 20

surface representation comparison

meshes -- implicit -- parametric -- subdiv accurate no yes yes yes concise no yes yes yes intuitive specification no no yes no local support yes no yes yes affine invariant yes yes yes yes arbitrary topology yes no no yes continuity no yes yes yes parameterization no no yes no efficient display yes no yes yes efficient intersection no yes no no

20

slide-21
SLIDE 21

implementing subdivision surfaces

21

slide-22
SLIDE 22

implementing subdivision surfaces

implementing subdiv notoriosly hard in standard formulation complex rules, requires data structures for adjacency reformulate as successive averaging based on A factored Approach to Subdivision Surfaces by Joe Warren and Scott Schaefer (download) subdivision requires more averaging passes to adjust position uses only a edge hash table; no complex data structures Loop, Catmull-Clark, mixed triangle/quad, creases will discuss Catmull-Clark only

22

slide-23
SLIDE 23

implementing catmull-clark subdiv

step 1: linear subdivision

23

slide-24
SLIDE 24

implementing catmull-clark subdiv

step 1: linear subdivision create one vertex for each vertex, edge, quad in original vertex from vertex: set same position vertex from edge: set in middle between endpoints vertex from face: set to face centroid vertex from edge: two faces share an edge, but we canonot duplicate use hash table to check if already created

= P′

v

Pv = ( + )/2 P′

e

Pe0 Pe1 = ( + + + )/4 P′

f

Pf0 Pf1 Pf2 Pf3

24

slide-25
SLIDE 25

implementing catmull-clark subdiv

step 1: linear subdivision create four faces for quad in original use hash table to find edge vertex index from two vertex indices

= ( , , , ) f ′0 P′

f0 P′ e

→ f0 f1 P′

f P′ e

→ f3 f0

= ( , , , ) f ′1 P′

f1 P′ e

→ f1 f2 P′

f P′ e

→ f0 f1

= ( , , , ) f ′2 P′

f2 P′ e

→ f2 f3 P′

f P′ e

→ f1 f2

= ( , , , ) f ′3 P′

f3 P′ e

→ f3 f4 P′

f P′ e

→ f2 f3

25

slide-26
SLIDE 26

implementing catmull-clark subdiv

step 2: averaging pass smooth vertex placement based on neightbors update vertex position as average of cetroid of faces touching it

= cetroid(f, )/count(f) for f such that i ∈ f P′′

i

P′

26

slide-27
SLIDE 27

implementing catmull-clark subdiv

step 3: correction pass need to correct for vertices that have non-standard number of faces correct vertex position after linear subdivision with vertex position after averaging

= − ( − ) ⋅ (4/count(f)) P′′′ P′ P′′ P′

27

slide-28
SLIDE 28

implementing catmull-clark subdiv

// step 1: pseudocode for v in mesh->vertex: tesselation->add_vertex(v) for e in mesh->edge: if e not in hash: tesselation->add_vertex(centroid(e)) hash->add(e) for f in mesh->face: tesselation->add_vertex(centroid(f)) for f: in mesh->face: tesselation->add_face(...) tesselation->add_face(...) tesselation->add_face(...) tesselation->add_face(...)

28

slide-29
SLIDE 29

implementing catmull-clark subdiv

// step 2: pseudocode avg_v = new vertex[len(tesselation->vertex)] avg_n = new int[len(tesselation->vertex)] for v in avg_v: v <- 0 // init to zero for n in avg_n: n <- 0 // init to zero for f : tesselation->face: c = centroid(f) for v_index in f: avg_v[v_index] += c avg_n[v_index] += 1 for v_index in range(len(avg_n)): avg_v[v_index] /= avg_n[v_index]

29

slide-30
SLIDE 30

implementing catmull-clark subdiv

// step 3: pseudocode for v_index in range(len(tesselation->vertex)): avg_v[v_index] = tesselation->vertex[v_index] + (avg_v[v_index]-tesselation->vertex[v_index]) * (4/avg_n[v_index])

30