04rqwer
-
Upload
michael-joyner -
Category
Documents
-
view
214 -
download
1
Transcript of 04rqwer
![Page 1: 04rqwer](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/1.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/2.jpg)
Player Movement/Collisions
Tips for Platformer 1
Playtesting
![Page 3: 04rqwer](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/3.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/4.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/5.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/6.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/7.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/8.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/9.jpg)
Ellipsoid collision detection demo
![Page 10: 04rqwer](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/10.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/11.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/12.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/13.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/14.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/15.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/16.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/17.jpg)
Case study: Overgrowth• Ledge climbing using two different collision tests
– Sphere test against wall– Cylinder test above ledge
![Page 18: 04rqwer](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/18.jpg)
Player Movement/Collisions
Tips for Platformer 1
Playtesting
![Page 19: 04rqwer](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/19.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/20.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/21.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/22.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/23.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/24.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/25.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/26.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/27.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/28.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/29.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/30.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/31.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/32.jpg)
Platformer overview
• Four weeks
1. Collision detection
2. Collision response
3. Pathfinding
4. Gameplay and UI
![Page 33: 04rqwer](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/33.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/34.jpg)
Collision debugger demo
![Page 35: 04rqwer](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/35.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/36.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/37.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/38.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/39.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/40.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/41.jpg)
Player Movement/Collisions
Tips for Platformer 1
Playtesting
![Page 42: 04rqwer](https://reader033.fdocument.pub/reader033/viewer/2022051708/577cce021a28ab9e788d12f3/html5/thumbnails/42.jpg)
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