Lecture07 – Terrain
Download
Report
Transcript Lecture07 – Terrain
Terrain Following
&
Collision Detection
1
Introduction (1/2)
Both of topics are very game-type-oriented
Terrain
For visual purpose
Ground / Building / Static models / Dynamic models
For terrain following
Polygon mesh
Grids
For path finding
Polygon mesh
Grids
Terrain following
Make a 3D entity (character or model) walking on terrain
Path finding
Find a “shortest” path to walk before moving
Game AI
A* algorithm
2
Introduction (2/2)
Collision detection
The basic solution for collision detection is solving the intersection of a ray
with a plane.
We will introduce :
Containment test
Separating axis
Collision avoidance
Will be introduced at Steer behavior in Game AI section
3
Terrain Formats
Grid
2D
Quadtree
Height map
Procedural height map
Using noise function to generate the height
ROAM
Real-time Optimally Adapting Meshes
Triangular mesh
Procedurally generated
Created by artists
Perlin Noise
4
Grid Map
2D grid map
Rectangular or Hexagonal grids
Attributes
Height
Walkable or not
Texture pattern ID
Step look terrain
Application
2D games
3D games with god view
2D tile-based game terrain
5
Height Map
Almost as same as 2D grid map but :"
Height on grid vertex
Only height is saved
Regular grid
Irregular grid but structured
Top view
Application
As the base data structure for ROAM terrain
Water simulation
6
ROAM
Real-time optimally adapting mesh
http://www.llnl.gov/graphics/ROAM/
Application
Fly-simulation
7
Chunked LOD Terrain
Use quad tree to construct the level-of-detail of terrain
A quad tree for LOD
8
Triangular Mesh
Possibly the most popular way for 3D games
General
Can be created by artists
Multiple-layered terrain issue
9
Barycentric Coordinate System
ha
(xa,ya,za)
Ac p
hb
h
(xb,yb,zb)
Ab
Aa
hc
h=
Aa
A
ha +
Ab
A
hb +
(xc,yc,zc)
Ac
A
hc
where A = Aa + Ab + Ac
If (Aa < 0 || Ab < 0 || Ac < 0) than
the point is outside the triangle
“Triangular Coordinate System”
“Barycentric Coordinate System”
10
Triangle Area – 2D
Area of a triangle in 2D
xa ya
A = ½ xb yb
xc yc
xa ya
= ½ (xa*yb + xb*yc + xc*ya – xb*ya – xc*yb – xa*yc)
(xa,ya,za)
(xb,yb,zb)
(xc,yc,zc)
11
Triangle Area – 3D
Area of a triangle in 3D
12
Barycentric Coordinate System - Application
Terrain following
Interpolating the height of arbitrary point within the triangle
Hit test
Intersection of a ray from camera to a screen position with a triangle
Ray cast
Intersection of a ray with a triangle
Collision detection
Intersection
13
Ray Cast – The Ray
Cast a ray to calculate the intersection of the ray with models
Use parametric equation for a ray
{
x = x0 + (x1 – x0) t
y = y0 + (y1 – y0) t, t = 0,
z = z0 + (z1 – z0) t
When t = 0, the ray is on the start point (x0, y0, z0)
Only the t 0 is the answer candidate
The smallest positive t is the answer
14
Ray Cast – The Plane
Each triangle in the 3D models has its plane equation.
Use ax + by + cz + d = 0 as the plane equation.
(a, b, c) is the plane normal vector.
|d| is the distance of the plane to origin.
Substitute the ray equation into the plane.
Solve the t to find the intersect point.
15
Terrain Following Using Triangular Mesh
Solve the terrain height for the object to stand on.
Use the triangular coordinate system
Find the next neighboring triangle
Half-edge data structure
16
Half-edge (1/2)
Create cohesive relationship between triangles using “half edge”
Use half-edge table to search the neighboring triangles
Edge = two halves
17
Half-edge (2/2)
struct HE_edge
{
HE_vert* vert; // vertex at the end of the half-edge
HE_edge* pair; // oppositely oriented adjacent half-edge
HE_face* face; // face the half-edge borders
HE_edge* next; // next half-edge around the face
};
struct HE_vert
{
float x;
float y;
float z;
HE_edge* edge; // one of the half-edges
// emantating from the vertex
};
struct HE_face
{
HE_edge* edge; // one of the half-edges bordering the face
};
http://www.flipcode.com/tutorials/tut_halfedge.shtml
18
Intersection
Ray cast
Containment test
Separating axes
19
2D Containment Test
Intersection = 1, inside
Intersection = 2, outside
(x0, y0)
Intersection = 0, outside
Trick : Parametric equation for a ray which is parallel to the x-axis
{
x = x0 + t
y = y0
, t = 0,
“if the No. of intersection is odd, the point is inside,
otherwise, is outside”
20
3D Containment Test
Same as the 2D containment test
“if the No. of intersection is odd, the point is inside,
otherwise, is outside”
21
Separating Axes
For convex objects only
If there is existing an axis (2D) or a plane (3D) to separate two convex objects,
these two objects are not intersected.
How ?
Project the vertices of each object on the axis/plane that is perpendicular
to axis/plane we are going to find.
Get the extreme of the projection area of each object.
If the projection are of these two object are not overlapped, the two
objects are not intersected.
22
Separating Axes Algorithm for Convex Polyhedra (1/3)
Bool TestIntersect(ConvexPolyhedron C0, ConvexPolyhedron C1)
{
// test faces of C0 for separation
for (i = 0; i < C0.GetFaceCount(); i++) {
D = C0.GetNormal(i);
ComputeInterval(C0, D, min0, max0);
ComputeInterval(C1, D, min1, max1);
if (max1 < min0 || max0 < min1) return false;
}
// test faces of C1 for separation
for (i = 0; i < C1.GetFaceCount(); i++) {
D = C1.GetNormal(i);
ComputeInterval(C0, D, min0, max0);
ComputeInterval(C1, D, min1, max1);
if (max1 < min0 || max0 < min1) return false;
}
23
Separating Axes Algorithm for Convex Polyhedra (2/3)
// test cross products of pairs of edges
for (i = 0; i < C0.GetEdgeCount(); i++) {
for (j = 0; j < C1.GetEdgeCount(); j++) {
D = Cross(C0.GetEdge(i), C1.GetEdge(j));
ComputeInterval(C0, D, min0, max0);
ComputeInterval(C1, D, min1, max1);
if (max1 < min0 || max0 < min1) return false;
}
}
return true;
}
24
Separating Axes Algorithm for Convex Polyhedra (3/3)
void ComputeInterval(ConvexPolyhedron C, Vector D,
double &min, double &max)
{
min = Dot(D, C.GetVertex(0));
max = min;
for (i = 1; i < C.GetVertexCount(); i++) {
value = Dot(D, C.GetVertex(i));
if (value < min) min = value;
else if (value > max) max = value;
}
}
25
Unaligned Collision Avoidance Behavior (碰撞迴避)
Turn away from possible collision (避免可能的碰撞)
Predict the potential collision (預估下一步的碰撞可能性)
Use bounding spheres
If possibly collide, (如果可能碰撞, 預估轉向力先行轉向)
Apply the steering on both characters
Steering direction is possible collision result
Use “future” possible position
The connected line between two sphere centers
Summary for Collision Detection
Use bounding volume to improve the performance
Cylinder volume for characters
Object-oriented bounding box (OBB) or bounding sphere for 3D models
Collision detection when the object/character is moving
Very game type oriented
Apply “Collision Avoidance” first, and then “Collision Detection”
27