Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Last Time • Simplification for LOD • Progressive Meshes • Runtime LOD 10/16/03 CS679 - Fall 2003 - Copyright Univ. of Wisconsin Today • Terrain – Creation – Rendering 10/16/03 CS679 - Fall 2003 - Copyright Univ. of Wisconsin Terrain • Terrain is obviously important to many games • As a model, it is very large • Creating every point explicitly by hand is not feasible, so automated terrain generation methods are common • When rendering, some of the terrain is close, and other parts are far away, leading to terrain LOD algorithms 10/16/03 CS679 - Fall 2003 - Copyright Univ. of Wisconsin Representing Terrain • The base representation for terrain is usually a height field – z=f(x,y) for (x,y) within the limits of the space – Precludes things like caves and overhangs, which must be treated specially • There are two common ways to represent the function f(x,y) – Explicitly store the value of f(x,y) for a discrete grid of (x,y) locations • Generally interpolate (bilinear) or triangulate to get points not on the grid • Easy to figure out what the height of the terrain is at any given (x,y) • Expensive to store the entire terrain – Store a polygonal mesh • Cheaper if the terrain has large flat areas • Harder to figure out what the height is under the player (have to know which triangle they are in) 10/16/03 CS679 - Fall 2003 - Copyright Univ. of Wisconsin Terrain LOD • As you have heard by now, terrain poses problems for static LOD methods – Must have high resolution in the near field, and low resolution in the distance, all in one model • Dynamic LOD methods are the answer – All based on the idea of cuts through a tree of potential simplifications • We will discuss the ROAM algorithm in detail – Other continuous LOD algorithms are similar in style • An alternative is to create fixed LODs for sub-regions and figure out how to join them at the seams 10/16/03 CS679 - Fall 2003 - Copyright Univ. of Wisconsin Terrain is Easier! • Assumption: We are starting with a height field defined on a regular grid – Assume it’s a square to make it easier – We can mesh it by forming triangles with the data points • The data is highly structured – Every data point has the same number of neighbors – Every triangle can be the same size – Hence, the tree of possible simplifications is very regular • Still, multiple possibilities exist for the triangulation and the simplification operations 10/16/03 CS679 - Fall 2003 - Copyright Univ. of Wisconsin Triangle Bintrees • Binary trees in which: – Each node represents a right-angled isosceles triangle – Each node has two children formed by splitting from the right angle vertex to the midpoint of the baseline – The leaf nodes use vertices from the original height field • Another way to build a spatial partitioning tree, but particularly well suited to simplification algorithms – Easy to maintain neighbor information – Easy to avoid T-vertices 10/16/03 CS679 - Fall 2003 - Copyright Univ. of Wisconsin Triangle Bintree Example 3 1 4 6 1 2 2 5 3 8 7 13 10 14 9 11 10/16/03 7 4 8 9 5 10 12 CS679 - Fall 2003 - Copyright Univ. of Wisconsin 11 6 12 13 14 Bintree Data Structure • Parent and child pointers • Neighbors – A left neighbor, a right neighbor, and a base neighbor – Note that the base and right angle give us a way to orient the triangle – Neighbors are not necessarily at your own level • Later, error bounds that say how much variation in height there is in your children 10/16/03 CS679 - Fall 2003 - Copyright Univ. of Wisconsin Cuts 3 1 4 6 1 2 2 5 3 8 7 7 4 8 9 5 10 10 9 10/16/03 CS679 - Fall 2003 - Copyright Univ. of Wisconsin 11 6 12 13 14 Neighbors 8 7 10 6 9 5 • • • • • • 5: left neighbor 6, right neighbor 9 6: left neighbor 8, right neighbor 5 7: left neighbor 8, base neighbor 10 8: base neighbor 6, right neighbor 7 9: base neighbor 5, left neighbor 10 10: base neighbor 7, right neighbor 9 • Note that 8 is 6’s left neighbor but 6 is 8’s base neighbor – If you are someone’s left/right/base neighbor they are not always your right/left/base neighbor • In other words, neighbors need not come from the same level in the tree 10/16/03 CS679 - Fall 2003 - Copyright Univ. of Wisconsin Not All Cuts Are Created Equal 3 1 1 4 6 2 3 5 7 8 2 4 8 9 5 10 11 6 12 13 7 10 9 10/16/03 Note the T-vertex - causes cracks in rendering CS679 - Fall 2003 - Copyright Univ. of Wisconsin 14 Generating Cuts • Cuts are generated by a sequence of split or merge steps – Split: Drop the cut below to include your children – Merge: Lift the cut up above two children • To avoid T-vertices, some splits lead to other, forced, splits • An LOD algorithm chooses which steps to apply to generate a particular triangle count or error rate 10/16/03 CS679 - Fall 2003 - Copyright Univ. of Wisconsin A Split • A split cuts a triangle in two by splitting its base edge – If the base edge is on a boundary, just split, as shown – If the base edge is shared, additional splits are forced • Add a new triangle to the mesh 1 3 6 7 10/16/03 2 4 8 9 5 10 CS679 - Fall 2003 - Copyright Univ. of Wisconsin 11 6 12 13 14 Forced Splits • Triangles are always split along their base • Hence, must also be able to split the base neighbor – Requires neighbors to be mutual base neighbors – If they are not base neighbors, even more splits are needed – Simple recursive formulation 10/16/03 CS679 - Fall 2003 - Copyright Univ. of Wisconsin Merges • A diamond is a merge candidate if the children of it’s members are in the triangulation – The children of the 7-10 diamond below are candidates – Look for parents of sibling leaf nodes that are base neighbors or have no base neighbors • Reduces the triangle count 1 8 2 7 10 3 4 5 6 9 7 10/16/03 8 9 10 CS679 - Fall 2003 - Copyright Univ. of Wisconsin 11 12 13 14 Refinement LOD Algorithm • Start with the base mesh • Repeatedly split triangles until done – Stop when a specific triangle count is reached, or … – Stop when error is below some amount • To guide the split order, assign priorities to each split and always do the one with the highest priority – After each split, update priorities of affected triangles – Sample priority: High priority to splits that will reduce big errors • What is the complexity of this? (Roughly) • A similar algorithm works by simplifying the mesh through merge operations. Why choose one over the other? 10/16/03 CS679 - Fall 2003 - Copyright Univ. of Wisconsin Refinement Notes • If the priorities are monotonic, then the resulting terrain is optimal – Monotonic: Priorities of children are not larger than that of their parent • Priorities can come from many sources: – In or out of view, silhouette, projected error, under a vehicle, line of sight, … • Does not exploit coherence: As the view moves over the terrain, the triangulation isn’t likely to change much • We should be able to start with the existing triangulation, and modify it to produce the new optimal triangulation 10/16/03 CS679 - Fall 2003 - Copyright Univ. of Wisconsin Dual Queue Optimization • Have the split queue, as before • Have a merge queue: – Queue of potential merges, with priority as the max of the split priority for the triangles in each merge • Repeat until target size/accuracy and the max split priority is less than the min merge priority – If the mesh is too large/accurate, do the optimal merge • Update data structures appropriately – Otherwise, do the optimal split • Update data structures appropriately 10/16/03 CS679 - Fall 2003 - Copyright Univ. of Wisconsin Why Does it Work? • The merge queue priorities tell you how much error you would add by doing each merge • The split queue tells you how much error you would remove by doing each split • A merge frees up two triangles, while a split takes at least one • If you can free some triangles with a merge and use them with a more effective split, then you win – The min in the merge queue is the least error you can add with a merge – The max in the split queue is the most error you can remove with a split – If you can trade a split for a merge and save some error, then do it 10/16/03 CS679 - Fall 2003 - Copyright Univ. of Wisconsin Projected Error Metrics • Idea is to figure out how far a sequence of merges moves the terrain from its original correct location – Measured in screen space, which is what the viewer sees • Start with bounds in world space, and then project the bounds at run-time – World space bounds are view independent – Projected screen space bounds are view dependent 10/16/03 CS679 - Fall 2003 - Copyright Univ. of Wisconsin World Space Bounds • With terrain, merge only moves points up or down • Bound how far a point can move with a wedgie – A bintree triangle extruded up and down to contain its children – Defined by d, the thickness of the extrusion • Fast to compute, so works for dynamic terrain – Important for explosion craters and the like d 10/16/03 CS679 - Fall 2003 - Copyright Univ. of Wisconsin Performance Bottlenecks • Storing and managing priorities for out-of-view triangles is a waste of time – Do standard frustum culling to identify them • Sending individual triangles is wasteful – Build strips as triangles are split and merged • Naively, at every frame, wedgies must be projected, new priorities computed and the queues re-sorted – Use the viewer’s velocity to bound the number of frames before a priority could possibly make it to the top of a heap – Delay recomputation until then • Priority queue: Bin priorities to reduce sorting cost – At low priorities, order within bins doesn’t matter 10/16/03 CS679 - Fall 2003 - Copyright Univ. of Wisconsin Additional Enhancements • Stop processing after a certain amount of time – Easily done: just stop processing the next split or merge – Result no longer optimal, but probably not bad • Cost of dual queue algorithm depends on the number of steps required to change one mesh into another – Check ahead of time how many steps might be required – If too may, just rebuild mesh from scratch using refinement algorithm • Can get accurate line-of-sight or under-vehicle height by manipulating priorities to force certain splits 10/16/03 CS679 - Fall 2003 - Copyright Univ. of Wisconsin Other Algorithms • Algorithm from Lindstrom et al is essentially the same idea as the ROAM refinement algorithm – Based on square blocks of (triangulated) terrain • Makes determining forced splits harder – Slightly different error bounds • An algorithm from the game community: – For a particular split operation, the viewer distance is the primary error factor – For each split, store distance at which it should occur – Check current mesh on each frame for splits/merges according to viewer distance – Non-optimal, but gets rid of priority queues (the big cost) 10/16/03 CS679 - Fall 2003 - Copyright Univ. of Wisconsin Todo • By Monday, Oct 20, Stage 3 goals • By Monday, Nov 3, Stage 3 demo 10/16/03 CS679 - Fall 2003 - Copyright Univ. of Wisconsin