青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Collision detection

http://en.wikipedia.org/wiki/Collision_detection

Collision detection

From Wikipedia, the free encyclopedia

Jump to: navigation, search

In physical simulations, video games and computational geometry, collision detection involves algorithms for checking for collision, i.e. intersection, of two given solids. Simulating what happens once a collision is detected is sometimes referred to as "collision response", for which see physics engine and ragdoll physics. Collision detection algorithms are a basic component of 3D video games. Without them, characters could go through walls and other obstacles.

Contents

[hide]

[edit] Overview

Billiards balls hitting each other are a classic example applicable within the science of collision detection.

In physical simulation, we wish to conduct experiments, such as playing billiards. The physics of bouncing billiard balls are well understood, under the umbrella of rigid body motion and elastic collisions. An initial description of the situation would be given, with a very precise physical description of the billiard table and balls, as well as initial positions of all the balls. Given a certain impulsion on the cue ball (probably resulting from a player hitting the ball with his cue stick), we want to calculate the trajectories, precise motion, and eventual resting places of all the balls with a computer program. A program to simulate this game would consist of several portions, one of which would be responsible for calculating the precise impacts between the billiard balls. This particular example also turns out to be numerically unstable: a small error in any calculation will cause drastic changes in the final position of the billiard balls.

Video games have similar requirements, with some crucial differences. While physical simulation needs to simulate real-world physics as precisely as possible, video games need to simulate real-world physics in an acceptable way, in real time and robustly. Compromises are allowed, so long as the resulting simulation is satisfying to the game player.

[edit] Collision detection in physical simulation

Physical simulators differ in the way they react on a collision. Some use the softness of the material to calculate a force, which will resolve the collision in the following time steps like it is in reality. Due to the low softness of some materials this is very CPU intensive. Some simulators estimate the time of collision by linear interpolation, roll back the simulation, and calculate the collision by the more abstract methods of conservation laws.

Some iterate the linear interpolation (Newton's method) to calculate the time of collision with a much higher precision than the rest of the simulation. Collision detection utilizes time coherence to allow ever finer time steps without much increasing CPU demand, such as in air traffic control.

After an inelastic collision, special states of sliding and resting can occur and, for example, the Open Dynamics Engine uses constrains to simulate them. Constrains avoid inertia and thus instability. Implementation of rest by means of a scene graph avoids drift.

In other words, physical simulators usually function one of two ways, where the collision is detected a posteriori (after the collision occurs) or a priori (before the collision occurs). In addition to the a posteriori and a priori distinction, almost all modern collision detection algorithms are broken into a hierarchy of algorithms.

[edit] A posteriori versus a priori

In the a posteriori case, we advance the physical simulation by a small time step, then check if any objects are intersecting, or are somehow so close to each other that we deem them to be intersecting. At each simulation step, a list of all intersecting bodies is created, and the positions and trajectories of these objects are somehow "fixed" to account for the collision. We say that this method is a posteriori because we typically miss the actual instant of collision, and only catch the collision after it has actually happened.

In the a priori methods, we write a collision detection algorithm which will be able to predict very precisely the trajectories of the physical bodies. The instants of collision are calculated with high precision, and the physical bodies never actually interpenetrate. We call this a priori because we calculate the instants of collision before we update the configuration of the physical bodies.

The main benefits of the a posteriori methods are as follows. In this case, the collision detection algorithm need not be aware of the myriad physical variables; a simple list of physical bodies is fed to the algorithm, and the program returns a list of intersecting bodies. The collision detection algorithm doesn't need to understand friction, elastic collisions, or worse, nonelastic collisions and deformable bodies. In addition, the a posteriori algorithms are in effect one dimension simpler than the a priori algorithms. Indeed, an a priori algorithm must deal with the time variable, which is absent from the a posteriori problem.

On the other hand, a posteriori algorithms cause problems in the "fixing" step, where intersections (which aren't physically correct) need to be corrected. In fact, there are some[who?] who believe that such an algorithm is inherently flawed and unstable[citation needed].

The benefits of the a priori algorithms are increased fidelity and stability. It is difficult (but not completely impossible) to separate the physical simulation from the collision detection algorithm. However, in all but the simplest cases, the problem of determining ahead of time when two bodies will collide (given some initial data) has no closed form solution -- a numerical root finder is usually involved.

Some objects are in resting contact, that is, in collision, but neither bouncing off, nor interpenetrating, such as a vase resting on a table. In all cases, resting contact requires special treatment: If two objects collide (a posteriori) or slide (a priori) and their relative motion is below a threshold, friction becomes stiction and both objects are arranged in the same branch of the scene graph; however, some believe that it poses special problems in a posteriori algorithm[citation needed].

[edit] Optimization

The obvious approaches to collision detection for multiple objects are very slow. Checking every object against every other object will, of course, work, but is too inefficient to be used when the number of objects is at all large. Checking objects with complex geometry against each other in the obvious way, by checking each face against each other face, is itself quite slow. Thus, considerable research has been applied to speeding up the problem.

[edit] Exploiting temporal coherence

In many applications, the configuration of physical bodies from one time step to the next changes very little. Many of the objects may not move at all. Algorithms have been designed so that the calculations done in a preceding time step can be reused in the current time step, resulting in faster algorithms.

At the coarse level of collision detection, the objective is to find pairs of objects which might potentially intersect. Those pairs will require further analysis. An early high performance algorithm for this was developed by M. C. Lin at U.C. Berkley [1], who suggested using axis-aligned bounding boxes for all n bodies in the scene.

Each box is represented by the product of three intervals (i.e., a box would be .) A common algorithm for collision detection of bounding boxes is sweep and prune. We observe that two such boxes, and intersect if, and only if, I1 intersects J1, I2 intersects J2 and I3 intersects J3. We suppose that, from one time step to the next, Ik and Jk intersect, then it is very likely that at the next time step, they will still intersect. Likewise, if they did not intersect in the previous time step, then they are very likely to continue not to.

So we reduce the problem to that of tracking, from frame to frame, which intervals do intersect. We have three lists of intervals (one for each axis) and all lists are the same length (since each list has length n, the number of bounding boxes.) In each list, each interval is allowed to intersect all other intervals in the list. So for each list, we will have an matrix M = (mij) of zeroes and ones: mij is 1 if intervals i and j intersect, and 0 if they do not intersect.

By our assumption, the matrix M associated to a list of intervals will remain essentially unchanged from one time step to the next. To exploit this, the list of intervals is actually maintained as a list of labeled endpoints. Each element of the list has the coordinate of an endpoint of an interval, as well as a unique integer identifying that interval. Then, we sort the list by coordinates, and update the matrix M as we go. It's not so hard to believe that this algorithm will work relatively quickly if indeed the configuration of bounding boxes does not change significantly from one time step to the next.

In the case of deformable bodies such as cloth simulation, it may not be possible to use a more specific pairwise pruning algorithm as discussed below, and an n-body pruning algorithm is the best that can be done.

If an upper bound can be placed on the velocity of the physical bodies in a scene, then pairs of objects can be pruned based on their initial distance and the size of the time step.

[edit] Pairwise pruning

Once we've selected a pair of physical bodies for further investigation, we need to check for collisions more carefully. However, in many applications, individual objects (if they are not too deformable) are described by a set of smaller primitives, mainly triangles. So now, we have two sets of triangles, and (for simplicity, we will assume that each set has the same number of triangles.)

The obvious thing to do is to check all triangles Sj against all triangles Tk for collisions, but this involves n2 comparisons, which is highly inefficient. If possible, it is desirable to use a pruning algorithm to reduce the number of pairs of triangles we need to check.

The most widely used family of algorithms is known as the hierarchical bounding volumes method. As a preprocessing step, for each object (in our example, S and T) we will calculate a hierarchy of bounding volumes. Then, at each time step, when we need to check for collisions between S and T, the hierarchical bounding volumes are used to reduce the number of pairs of triangles under consideration. For the sake of simplicity, we will give an example using bounding spheres, although it has been noted that spheres are undesirable in many cases.[citation needed]

If E is a set of triangles, we can precalculate a bounding sphere B(E). There are many ways of choosing B(E), we only assume that B(E) is a sphere that completely contains E and is as small as possible.

Ahead of time, we can compute B(S) and B(T). Clearly, if these two spheres do not intersect (and that is very easy to test,) then neither do S and T. This is not much better than an n-body pruning algorithm, however.

If is a set of triangles, then we can split it into two halves and . We can do this to S and T, and we can calculate (ahead of time) the bounding spheres B(L(S)),B(R(S)) and B(L(T)),B(R(T)). The hope here is that these bounding spheres are much smaller than B(S) and B(T). And, if, for instance, B(S) and B(L(T)) do not intersect, then there is no sense in checking any triangle in S against any triangle in L(T).

As a precomputation, we can take each physical body (represented by a set of triangles) and recursively decompose it into a binary tree, where each node N represents a set of triangles, and its two children represent L(N) and R(N). At each node in the tree, as a we can precompute the bounding sphere B(N).

When the time comes for testing a pair of objects for collision, their bounding sphere tree can be used to eliminate many pairs of triangles.

Many variants of the algorithms are obtained by choosing something other than a sphere for B(T). If one chooses axis-aligned bounding boxes, one gets AABBTrees. Oriented bounding box trees are called OBBTrees. Some trees are easier to update if the underlying object changes. Some trees can accommodate higher order primitives such as splines instead of simple triangles.

[edit] Exact pairwise collision detection

Once we're done pruning, we are left with a number of candidate pairs to check for exact collision detection.

A basic observation is that for any two convex objects which are disjoint, one can find a plane in space so that one object lies completely on one side of that plane, and the other object lies on the opposite side of that plane. This allows the development of very fast collision detection algorithms for convex objects.

Early work in this area involved "separating plane" methods. Two triangles collide essentially only when they can not be separated by a plane going through three vertices. That is, if the triangles are v1,v2,v3 and v4,v5,v6 where each vj is a vector in , then we can take three vertices, vi,vj,vk, find a plane going through all three vertices, and check to see if this is a separating plane. If any such plane is a separating plane, then the triangles are deemed to be disjoint. On the other hand, if none of these planes are separating planes, then the triangles are deemed to intersect. There are twenty such planes.

If the triangles are coplanar, this test is not entirely successful. One can either add some extra planes, for instance, planes that are normal to triangle edges, to fix the problem entirely. In other cases, objects that meet at a flat face must necessarily also meet at an angle elsewhere, hence the overall collision detection will be able to find the collision.

Better methods have since been developed. Very fast algorithms are available for finding the closest points on the surface of two convex polyhedral objects. Early work by M. C. Lin [1] used a variation on the simplex algorithm from linear programming. The Gilbert-Johnson-Keerthi distance algorithm has superseded that approach. These algorithms approach constant time when applied repeatedly to pairs of stationary or slow-moving objects, when used with starting points from the previous collision check.

The end result of all this algorithmic work is that collision detection can be done efficiently for thousands of moving objects in real time on typical personal computers and game consoles.

[edit] A priori pruning

Where most of the objects involved are fixed, as is typical of video games, a priori methods using precomputation can be used to speed up execution.

Pruning is also desirable here, both n-body pruning and pairwise pruning, but the algorithms must take time and the types of motions used in the underlying physical system into consideration.

When it comes to the exact pairwise collision detection, this is highly trajectory dependent, and one almost has to use a numerical root-finding algorithm to compute the instant of impact.

As an example, consider two triangles moving in time v1(t),v2(t),v3(t) and v4(t),v5(t),v6(t). At any point in time, the two triangles can be checked for intersection using the twenty planes previously mentioned. However, we can do better, since these twenty planes can all be tracked in time. If P(u,v,w) is the plane going through points u,v,w in then there are twenty planes P(vi(t),vj(t),vk(t)) to track. Each plane needs to be tracked against three vertices, this gives sixty values to track. Using a root finder on these sixty functions produces the exact collision times for the two given triangles and the two given trajectory. We note here that if the trajectories of the vertices are assumed to be linear polynomials in t then the final sixty functions are in fact cubic polynomials, and in this exceptional case, it is possible to locate the exact collision time using the formula for the roots of the cubic. Some numerical analysts suggest that using the formula for the roots of the cubic is not as numerically stable as using a root finder for polynomials.[citation needed]

[edit] Spatial partitioning

Alternative algorithms are grouped under the spatial partitioning umbrella, which includes octrees, binary space partitioning (or BSP trees) and other, similar approaches. If one splits space into a number of simple cells, and if two objects can be shown not to be in the same cell, then they need not be checked for intersection. Since BSP trees can be precomputed, that approach is well suited to handling walls and fixed obstacles in games. These algorithms are generally older than the algorithms described above.

[edit] Video games

Video games have to split their very limited computing time between several tasks. Despite this resource limit, and the use of relatively primitive collision detection algorithms, programmers have been able to create believeable, if inexact, systems for use in games.

For a long time, video games had a very limited number of objects to treat, and so checking all pairs was not a problem. In two-dimensional games, in some cases, the hardware was able to efficiently detect and report overlapping pixels between sprites on the screen. In other cases, simply tiling the screen and binding each sprite into the tiles it overlaps provides sufficient pruning, and for pairwise checks, bounding rectangles or circles are used and deemed sufficiently accurate.

Three dimensional games have used spatial partitioning methods for n-body pruning, and for a long time used one or a few spheres per actual 3D object for pairwise checks. Exact checks are very rare, except in games attempting to simulate reality closely. Even then, exact checks are not necessarily used in all cases.

Because games use simplified physics, stability is not as much of an issue.[citation needed] Almost all games use a posteriori collision detection, and collisions are often resolved using very simple rules. For instance, if a character becomes embedded in a wall, he might be simply moved back to his last known good location. Some games will calculate the distance the character can move before getting embedded into a wall, and only allow him to move that far.

A slightly more sophisticated and striking effect is ragdoll physics. If a video game character is disabled, instead of playing a preset animation, a simplified skeleton of the character is animated as if it were a rag doll. This rag doll falls limp, and might collide with itself and the environment, in which case it should behave appropriately.

In many cases for video games, approximating the characters by a point is sufficient for the purpose of collision detection with the environment. In this case, binary space partition trees provide a viable, efficient and simple algorithm for checking if a point is embedded in the scenery or not. Such a data structure can also be used to handle "resting position" situation gracefully when a character is running along the ground. Collisions between characters, and collisions with projectiles and hazards, are treated separately.

A robust simulator is one that will react to any input in a reasonable way. For instance, if we imagine a high speed racecar video game, from one simulation step to the next, it is conceivable that the cars would advance a substantial distance along the race track. If there is a shallow obstacle on the track (such as a brick wall), it is not entirely unlikely that the car will completely leap over it, and this is very undesirable. In other instances, the "fixing" that the a posteriori algorithms require isn't implemented correctly, and characters find themselves embedded in walls, or falling off into a deep black void. These are the hallmarks of a mediocre collision detection and physical simulation system.

[edit] Open Source Collision Detection

  • GJKD A 2D implementation of the Gilbert-Johnson-Keerthi (GJK) algorithm, written in D.
  • MPR2D A 2D implementation of the Minkowski Portal Refinement (MPR) Algorithm, written in D.

[edit] References

  1. ^ Lin, Ming C. "Efficient Collision Detection for Animation and Robotics (thesis)". University of California, Berkeley.

[edit] See also

[edit] External links

posted on 2008-11-22 23:25 zmj 閱讀(2289) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久久999| 亚洲一区二区三区免费视频| 在线欧美亚洲| 国模一区二区三区| 红桃视频一区| 亚洲第一区中文99精品| 亚洲人成网站777色婷婷| 91久久国产综合久久蜜月精品 | 久久成人免费| 久久视频国产精品免费视频在线| 久久精品在线| 免费看精品久久片| 免费不卡在线观看av| 久久综合色8888| 欧美成人按摩| 亚洲精品一级| 亚洲自拍偷拍一区| 欧美在线亚洲| 欧美极品影院| 国产精品久久久一本精品| 国产一区二区三区的电影| 亚洲成色www8888| 亚洲一区二区在线| 嫩草影视亚洲| 亚洲一区二区三区四区五区黄| 久久激情久久| 欧美三日本三级少妇三2023| 国产一区二区三区在线观看免费视频 | 一区二区日本视频| 久久久91精品国产一区二区精品| 欧美精品免费看| 国产亚洲一区二区三区| 夜夜嗨av一区二区三区四区| 久久久一本精品99久久精品66| 亚洲三级性片| 欧美一区高清| 国产精品久久国产三级国电话系列 | 国产精品久久一级| 亚洲精品乱码视频| 久久人人97超碰人人澡爱香蕉| 亚洲人成亚洲人成在线观看| 欧美一区在线直播| 国产精品毛片一区二区三区 | 欧美一区二区三区在线观看视频| 亚洲第一久久影院| 欧美一级一区| 国产精品免费视频xxxx| 一本色道久久88综合亚洲精品ⅰ| 久久人人爽人人爽爽久久| 亚洲午夜影视影院在线观看| 欧美日韩国产大片| 亚洲靠逼com| 欧美成人自拍| 久久国产免费| 国产亚洲va综合人人澡精品| 亚洲欧美日韩精品久久奇米色影视| 亚洲国产精品久久人人爱蜜臀| 久久久久久午夜| 国内成+人亚洲+欧美+综合在线| 午夜精品久久久久久久99水蜜桃 | 久久久蜜臀国产一区二区| 亚洲午夜精品福利| 国产精品美女久久久久久免费| 99在线精品视频| 亚洲精品国产系列| 欧美日韩国产系列| 亚洲网站啪啪| 亚洲精品在线免费| 欧美三级视频在线| 午夜精品久久久| 欧美一区二区女人| 伊人伊人伊人久久| 亚洲福利国产| 欧美三级视频在线播放| 亚洲欧美日韩一区二区三区在线观看| 亚洲天堂网在线观看| 国产情侣一区| 欧美成人免费小视频| 欧美国产日韩a欧美在线观看| 日韩午夜电影av| 亚洲精品123区| 亚洲精品中文字幕女同| 欧美精品一区二区精品网| 亚洲日本aⅴ片在线观看香蕉| 亚洲激情自拍| 国产精品麻豆va在线播放| 久久精品综合| 免费观看久久久4p| 亚洲午夜精品福利| 午夜影院日韩| 在线免费不卡视频| 亚洲人成网站在线观看播放| 欧美体内she精视频在线观看| 亚洲欧美日韩综合国产aⅴ| 欧美一区二区三区视频在线| 亚洲国内精品在线| 中文在线不卡视频| 黄色综合网站| 亚洲看片一区| 黄色精品一二区| 亚洲久久一区二区| 精品二区视频| 亚洲一区二区黄| 伊人成年综合电影网| 日韩亚洲成人av在线| 国内成人在线| 亚洲午夜久久久| 亚洲国产一区二区三区a毛片 | 亚洲国产视频a| 国产精品视频一二三| 亚洲第一久久影院| 国产亚洲女人久久久久毛片| 亚洲精选国产| 亚洲高清在线| 欧美一区二区在线看| 在线天堂一区av电影| 久久深夜福利| 久久九九热免费视频| 国产精品扒开腿爽爽爽视频| 亚洲欧美日本日韩| 美女被久久久| 欧美一区二区视频在线观看2020| 蜜桃av一区二区在线观看| 欧美一区2区三区4区公司二百| 欧美激情一区二区三级高清视频| 久久亚洲捆绑美女| 国产欧美日韩视频在线观看| 99视频超级精品| 亚洲欧洲日夜超级视频| 久久久久一本一区二区青青蜜月| 亚洲男人的天堂在线aⅴ视频| 欧美激情视频网站| 亚洲高清电影| 最新成人在线| 狂野欧美激情性xxxx欧美| 久久久九九九九| 国产原创一区二区| 欧美在线观看你懂的| 久久精品国产99| 国产精品日韩在线观看| 在线综合亚洲| 亚洲欧美在线一区| 国产精品婷婷午夜在线观看| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 美女视频网站黄色亚洲| 伊人激情综合| 男人的天堂亚洲在线| 亚洲国产欧美一区| 日韩视频一区二区在线观看 | aa级大片欧美三级| 中国女人久久久| 国产精品久久久久秋霞鲁丝| 亚洲欧美亚洲| 免费久久99精品国产| 亚洲日本精品国产第一区| 欧美日本视频在线| 亚洲综合首页| 欧美gay视频激情| 一本色道久久综合狠狠躁篇怎么玩 | 一本色道88久久加勒比精品 | 国产三级精品三级| 久久久久.com| 亚洲福利专区| 性欧美暴力猛交另类hd| 国内一区二区三区| 欧美韩日一区二区| 亚洲在线播放| 亚洲电影免费观看高清完整版在线观看 | 模特精品裸拍一区| 亚洲精品久久久久久久久| 香蕉亚洲视频| 一区二区在线视频观看| 欧美精品一区二| 亚洲免费在线精品一区| 美女久久一区| 亚洲自拍偷拍视频| 在线观看视频一区二区欧美日韩| 欧美日韩精品一区二区| 久久精品视频免费观看| 91久久夜色精品国产九色| 欧美在线免费观看| 亚洲欧洲在线看| 国产欧美一区二区三区视频| 欧美成人蜜桃| 欧美一站二站| 亚洲特黄一级片| 亚洲高清不卡在线| 久久精品免费播放| 在线亚洲精品| 亚洲国产美女| 国产欧美精品日韩区二区麻豆天美| 久久综合九色九九| 亚洲欧美日韩国产成人| 99av国产精品欲麻豆| 亚洲第一级黄色片| 久久这里有精品视频| 性欧美大战久久久久久久久| 妖精成人www高清在线观看| 精品av久久707| 国产亚洲精品一区二区|