42
Announcements Please don’t hand in again after a deadline before receiving your grade report Your late handin will overwrite your on-time handin Email the TAs when you are using a standard retry Otherwise your handin might not get graded on time Keep up the good work! :D

04rqwer

Embed Size (px)

Citation preview

Page 1: 04rqwer

Announcements

• Please don’t hand in again after a deadline before receiving your grade report– Your late handin will overwrite your on-time handin

• Email the TAs when you are using a standard retry– Otherwise your handin might not get graded on time

• Keep up the good work! :D

Page 2: 04rqwer

Player Movement/Collisions

Tips for Platformer 1

Playtesting

Page 3: 04rqwer

Representing player movement

• Real world: left foot, right foot, ...– Not natural with mouse and keyboard

– QWOP in 3D

• Simplify the problem– 3D primitive representing player volume

– Animation state a side effect of collision state

– What 3D shape should be used?

• There are many ways to do this; no one right answer

Page 4: 04rqwer

Player movement differences• Player-movement collision model is not used for entity-

to-entity collisions– For example, energy balls hitting the player in Portal uses a

more accurate collision model with a bounding volume per body part

• Player-movement collision model is not used for physics– Player movement is separate from physics– Player's bounding volume will be locked to the upright

position, represents player intent while moving

Page 5: 04rqwer

Shape: Axis-aligned box• Pros:

– Simple collision tests for axis-aligned worlds

• Cons:– Player doesn't have the same

diameter in all directions

– Complicated collision tests for arbitrary worlds

– Stairs need special handling

– Player “hovers” on slopes

Page 6: 04rqwer

Shape: Cylinder

• Pros:

– Player has the same diameter in all directions

• Cons:

– Collision tests complicated by caps

– Stairs need special handling

– Player still hovers on slopes

Page 7: 04rqwer

Shape: Upside-down cone• Pros:

– Naturally climb up stairs (and objects less than the player's height)

– Player doesn't hover on slopes

• Cons:– Complicated collision tests– Sliding doesn't make sense

for some gamesCone naturally climbs objectswhen pushed against them

Page 8: 04rqwer

Shape: Ellipsoid• Pros:

– Collision tests are simpler than cylinder

– Player will be closer to the ground on slopes

– Player will naturally slide up stairs

• Cons:– Player will "dip" down a bit

before going off an edge

Page 9: 04rqwer

Ellipsoid collision detection demo

Page 10: 04rqwer

Collision detection strategies• Static collision detection: given two (or more)

objects, determine if they are overlapping• Dynamic collision detection: given two (or more)

objects, determine at what time 𝑡 they will collide– Iterative: sample at points along a path and perform

static queries– Analytic: compute the exact point of collision using

parametric equations

Page 11: 04rqwer

Static collision detection• Appropriate for whenever objects aren't moving• Also appropriate for large, slowly moving objects

– Especially when no collision response is needed

• Tunneling is a problem: moving entirely through an object in the span of one frame– Collision detection starts failing when frame rate drops!

• May be difficult to generate appropriate collision response

Page 12: 04rqwer

Iterative collision detection

• Move in small increments and repeatedly query

• Easy to deal with complex curving paths

• Tunneling still possible if increment size is too large– Running collision detection at a fixed frame rate helps

mitigate this, but not at high velocities

• Repeated querying is expensive

Page 13: 04rqwer

Analytic collision detection

• Formulate path as a parametric equation, solve for intersection

• Only practical for simple formulas (straight lines)

• Faster than iterative collision detection

• Eliminates tunneling

Page 14: 04rqwer

Player-world collision detection• Problem:

– Given a world specified with triangles and a player modeled as an ellipsoid, do I hit something moving from A to B? Where?

• Solution:– Because tests are limited to ellipsoids and triangles, we can

derive an analytic solution– We will go over the math in the next section

• You will be implementing this

– Iterative solution could also work for this scenario, though we won't cover it in depth

Page 15: 04rqwer

Player-world collision detection• Assume player moves in a straight line in one update step

– Math for a line is much simpler– Raycast from starting position to new position

• Do triangle-ellipsoid sweep test for all triangles in the level and take the closest one– Can optimize using spatial acceleration data structure to only

test relevant triangles

• In the next section, we will talk about colliding an ellipsoid with a single triangle

Page 16: 04rqwer

Hybrid approaches

• Ellipsoid not best for every situation– Possibly undesirable behavior of sliding off ledges

– Tough to handle climbing up ledges

– May want to special-case certain movement scenarios

• Possible solution: multiple collision representations– Collision model on ledge might be different than on ramp

– Sometimes use multiple tests at once• e.g. climbing up a ledge

Page 17: 04rqwer

Case study: Overgrowth• Ledge climbing using two different collision tests

– Sphere test against wall– Cylinder test above ledge

Page 18: 04rqwer

Player Movement/Collisions

Tips for Platformer 1

Playtesting

Page 19: 04rqwer

Analytic ellipsoid-triangle collision• Sphere intersection tests are

easier– Squash world so ellipsoid is a

unit sphere– Do collision detection in that

space, then convert back

• Change of vector spaces– Ellipsoid has radius R = (rx,ry,rz)– Use basis (rx,0,0), (0,ry,0),

(0,0,rz)– Ellipsoid space to sphere space:

component-wise division by R

rx and rz

ry

Page 20: 04rqwer

Analytic ellipsoid-triangle collision• Analytic equation for a moving sphere

– Unit sphere moving from 𝐴 at 𝑡=0 to 𝐵 at 𝑡=1– Location of center: 𝐴 + 𝐵 − 𝐴 𝑡– Point 𝑃 on surface at 𝑡 if [𝐴 + 𝐵 − 𝐴 𝑡] − 𝑃 2 = 1

• Will be solving for 𝑡 in sphere space– Value of 𝑡 will also be correct for ellipsoid space

• Split collision detection into three cases:– Interior, edge, vertex

Page 21: 04rqwer

Analytic sphere-interior collision• Intersect moving sphere with

plane• If intersection is inside triangle,

stop the collision test– An interior collision will always be

closer than a vertex or edge collision

• If intersection is outside triangle, continue on to testing against edges and vertices– NO short circuit, must test ALL

vertices and edges

1 unit

Player's sphere

A

B

Page 22: 04rqwer

Analytic sphere-interior collision

• Sphere-plane intersection– Equivalent to ray-plane

intersection using the point on the sphere that is closest to the plane

– Given plane with normal 𝑁, closest point is 𝐴 −𝑁

1 unit

Player's sphere

A - N

B - N

N

Page 23: 04rqwer

Analytic sphere-interior collision• Point P on plane if

𝑁 • (𝑃 − 𝑆) = 0– Where S is any point on the plane,

such as one of the vertices

• Set 𝑃 = (𝐴 − 𝑁) + (𝐵 − 𝐴)𝑡• Solve for 𝑡 in

𝑁 • ([ 𝐴 − 𝑁 + 𝐵 − 𝐴 𝑡] − 𝑆) = 0

– That means

𝑡 =−𝑁•(𝐴−𝑁−𝑆)

𝑁 • (𝐵 − 𝐴)

1 unit

Player's sphere

A - N

B - N

N

S

P

Page 24: 04rqwer

Point-in-triangle test

• Point P (on plane) is inside triangle ABC iff the sub-triangles PAB, PBC, and PCA are all clockwise or all counterclockwise

A

P

CB

A

P

CB

PAB, PBC, PCA are CCWP is inside

PAB, PBC are CCWPCA is CWP is outside

Page 25: 04rqwer

Point-in-triangle test

• Sub-triangles have same winding order (CW or CCW) if normals are in same direction

• Normal is cross product of first edge with second edge:𝑁 = 𝐵 − 𝐴 × (𝐶 − 𝐴)

• Can compare two normals using their dot product– Same direction if 𝑛1 • 𝑛2 > 0

– Not the same direction if 𝑛1 • 𝑛2 ≤ 0

Page 26: 04rqwer

Analytic sphere-edge collision• Sphere vs. edge is the same as sphere vs. line segment

– Intersect moving sphere with the infinite line containing the edge

– Reject intersection if it occurs outside the line segment

• How do we collide a moving sphere with a line?– Really just a line and a ray that "collide" at a certain

distance apart– If we treat the line as an infinite cylinder, we can use ray-

cylinder intersection

Page 27: 04rqwer

Analytic sphere-edge collision• Defining the surface of an

infinite cylinder with vectors– Given two points 𝐶 and 𝐷

along cylinder axis

– Area of parallelogram formed by two vectors is the length of their cross product

– Point 𝑃 on surface if 𝑃 − 𝐶 × (𝐷 − 𝐶) 2 =𝐷 − 𝐶 2

D

C

1 unit

P

CD

P

Green parallelogram area is equal to gray rectangle area if P is on cylinder surface.

Page 28: 04rqwer

Analytic sphere-edge collision• Set 𝑃 = 𝐴 + (𝐵 − 𝐴)𝑡• Substitute into previous equation:• 𝐴 + 𝐵 − 𝐴 𝑡 − 𝐶 × (𝐷 − 𝐶) 2 = 𝐷 − 𝐶 2

• Solving for 𝑡, you get a quadratic (𝑎𝑡2+ 𝑏𝑡 + 𝑐 = 0) where

• 𝑎 = (𝐵 − 𝐴) × (𝐷 − 𝐶) 2

• 𝑏 = 2((𝐵 − 𝐴) × (𝐷 − 𝐶)) • ((𝐴 − 𝐶) × (𝐷 − 𝐶))

• 𝑐 = (𝐴 − 𝐶) × (𝐷 − 𝐶) 2− 𝐷 − 𝐶 2

• Solve using quadratic equation, use lesser 𝑡 value

B

A

P

Page 29: 04rqwer

Analytic sphere-edge collision• Discard intersection if not between C and D

– Will be handled by vertex collision test

• To check if intersection is between C and D:– Get vector from C to intersection point P

• 𝑃 − 𝐶

– Project this vector onto cylinder axis

• (𝑃 − 𝐶) •𝐷−𝐶

𝐷−𝐶

– Check if projection is in the range 0, 𝐷 − 𝐶

• 0 < (𝑃 − 𝐶) •𝐷−𝐶

𝐷−𝐶< 𝐷 − 𝐶

– Optimized by multiplying by 𝐷 − 𝐶 :• 0 < (𝑃 − 𝐶) • (𝐷 − 𝐶) < 𝐷 − 𝐶 2

P

Page 30: 04rqwer

Analytic sphere-vertex collision• Collision test against a triangle

vertex V• How do we collide a moving

sphere against a point?– Really just two points that

"collide" at a certain distance apart

– We know how to do a ray-sphere intersection test

– Moving sphere vs. point is equivalent to sphere vs. moving point (in the opposite direction)

𝐴𝑉

𝐵

Triangle

𝑉 − (𝐵 − 𝐴)

Page 31: 04rqwer

Analytic sphere-vertex collision

𝐴𝑉Triangle

• Point P on sphere if 𝑃 − 𝐴 2 = 1– Set 𝑃 = 𝑉 − (𝐵 − 𝐴)𝑡

– Solve [𝑉 − (𝐵 − 𝐴)𝑡] − 𝐴 2 = 1 for 𝑡

• Looks like𝑎𝑡2 + 𝑏𝑡 + 𝑐 = 0 where

– 𝑎 = 𝐵 − 𝐴 2

– 𝑏 = −2(𝐵 − 𝐴) • (𝑉 − 𝐴)

– 𝑐 = 𝑉 − 𝐴 2 − 1

𝑉 − (𝐵 − 𝐴)

𝑃

Page 32: 04rqwer

Platformer overview

• Four weeks

1. Collision detection

2. Collision response

3. Pathfinding

4. Gameplay and UI

Page 33: 04rqwer

Platformer: week 1• Collision detection

– Analytic ellipsoid-triangle collisions– Develop collision code separate from game engine

• Use provided debugger project– Camera controls and ellipsoid manipulation are built

in already– World consists of a single triangle– Test very thoroughly!

Page 34: 04rqwer

Collision debugger demo

Page 35: 04rqwer

C++ tip of the week• Super bonus combo week!• You will be starting a new engine for Platformer

– Take this opportunity to not make the mistakes you made in Minecraft

• We will be covering multiple C++ tips today– Using types by value– Arrays are rarely useful– Being const-correct

Page 36: 04rqwer

Using types by value• In Java, you can only access aggregate types (non-primitives, such as objects and

arrays) by pointer• In C++, you can have aggregate types by value

– On the stack– In other big types

• It’s safer– Automatically destructed when leaving scope/containing type destructed

• It’s more efficient– Ensures cache locality of related data– Accesses can be collapsed into a single dereference rather than multiple

• Do this wherever possible• However, some reasons to avoid are:

– Copying large things by value– Polymorphism/slicing

Page 37: 04rqwer

Types by value example// With pointers

class World {Camera* camera;QList<Vector3*>* points;Block*** blocks;World() {

camera = new Camera();points = new QList<Vector3*>();for (/*something*/) {

points.append(new Vector3(0,0,0));}blocks = new Block**[32];for (int x=0; x < 32; ++x) {

blocks[x] = new Block*[32];for (int y=0; y < 32; ++y) {

blocks[x][y] = new Block[32];}

}}

// continued

// continued

~World() {delete camera;for (QList<Vector3*>::iterator iter = points.begin();

iter != points.end(); ++points)delete *iter;

for (int x=0; x < 32; ++x) {for (int y=0; y < 32; ++y) {

delete blocks[x][y];}delete blocks[x];

}delete blocks;

}};

// With value types

class World {Camera camera;QList<Vector3> points;Block blocks[32][32][32];

};

Page 38: 04rqwer

Arrays are rarely useful• Problems with arrays:

– They have no bounds checking– They cannot change size

• Alternatives:– Lists: QList or std::list– Vectors: QVector or std::vector

• Guarantees adjacency in memory

• Exception: fixed-length arrays by value can be useful– Examples: Chunk, Triangle

Page 39: 04rqwer

const correctness• The const keyword states that a value never

changes after it is initialized– Enforced by the compiler

• Often used with method parameters– Indicates that the value pointed to/referenced will not

be changed by the method or function

• The more you use it, the safer your code is– If you can’t change it, you can’t corrupt its memory

Page 40: 04rqwer

const example• Block indexChunk(Chunk chunk, int x, int y, int z);

– By value: bad, copies the entire chunk!

• Block indexChunk(Chunk& chunk, int x, int y, int z);– Reference: better (no copying), but now function can modify the chunk!

• Block indexChunk(const Chunk& chunk, int x, int y, int z);– Const reference: good (no copying, unmodifiable)

• Block Chunk::index(int x, int y, int z) {• this->blocks.clear(); // bad: can modify the chunk!• }• Block Chunk::index(int x, int y, int z) const {• this->blocks.clear(); // good: this is a compile error• }

Page 41: 04rqwer

Player Movement/Collisions

Tips for Platformer 1

Playtesting

Page 42: 04rqwer

Playtesting• Two random playtesting groups

– Each person playtests the other group’s handins– Run cs195u_playtest minecraft <login>

– Feedback form URL will be zwritten to you

• Feedback form– Anonymous to playtestee, but not to us– Give constructive criticism, positive feedback, and as

specific bug reports as possible