c_intersect(VECTOR* min1, VECTOR* max1, VECTOR* vel1,
VECTOR* min2, VECTOR* max2, VECTOR* vel2)
Erkennt die Kollision zweier sich bewegender Bounding-Boxen. Lässt sich für viele Zwecke verwenden, beispielsweise zum Testen ob ein Strahl mit einer Box kollidiert, oder für die Kollisionserkennung von sich bewegenden Paneln in einem 2D-Spiel. 8.10
Parameter:
min1, max1 - erste Bounding-Box.
vel1 - Geschwindigkeitsvektor der ersten Bounding-Box oder NULL für keine Geschwindigkeit.
min2, max2 - zweite Bounding-Box.
vel2 -Geschwindigkeitsvektor der zweiten Bounding-Box A8.11 oder NULL für keine Geschwindigkeit.
Rückgabewerte:
0 für keine Kollision , -1 für eine Überschneidung, ansonsten der Abstand bis zur Kollision.
Geschwindigkeit:
Schnell
Bemerkungen:
- Für 2D-Kollisionen setzen Sie die Z-Komponente aller Vektoren auf 0.
- Um zu erkennen ob sich zwei Boxen überschneiden, setzen Sie beide vel-Parameter auf NULL.
- Um zu erkennen ob ein Punkt innerhalb einer Box liegt, setzen Sie die Parameter min1 und max1 auf die Position des Punktes.
- Um zu erkennen ob ein Strahl mit einer Box kollidiert, setzen Sie die Parameter min1 und max1 auf die Startposition des Strahls und vel1 auf einen Vektor mit Strahlrichtung und -Länge. A8.11
- Um die Kollisionsposition eines sich bewegenden und eines unbeweglichen Objekts zu bestimmen, setzen Sie vel1 auf einen Vektor mit der Bewegungsrichtung und zurückgelegten Distanz per Frame.
Beispiel:
// Collision test of a moving panel
VECTOR* pan_min(PANEL* pan)
{
return vector(pan.pos_x,pan.pos_y,0);
}
VECTOR* pan_max(PANEL* pan)
{
return vector(pan.pos_x+pan.size_x,pan.pos_y+pan.size_y,0);
}
void main()
{
// create a blue panel
PANEL* pan1 = pan_create(NULL,1);
set(pan1,LIGHT|SHOW);
vec_set(pan1.blue,COLOR_BLUE);
pan1.pos_x = 310;
pan1.pos_y = 300;
pan1.size_x = 40;
pan1.size_y = 40;
// create a red panel
PANEL* pan2 = pan_create(NULL,2);
set(pan2,LIGHT|SHOW);
vec_set(pan2.blue,COLOR_RED);
pan2.pos_x = 10;
pan2.pos_y = 20;
pan2.size_x = 100;
pan2.size_y = 150;
// move the blue panel with collision detection
while(1)
{
VECTOR speed;
vec_set(speed,vector(-5,-5,0));
var dist = c_intersect(pan_min(pan1),pan_max(pan1),speed,
pan_min(pan2),pan_max(pan2),NULL);
if(dist) // collision?
vec_normalize(speed,dist); // distance vector up to the collision point
pan1.pos_x += speed.x; // move panel by remaining distance
pan1.pos_y += speed.y;
if (dist) break; // break on collision
wait(1);
}
wait(2); // swap screen buffer to foreground, for displaying the actual position
printf("Collision!");
}
Siehe auch:
c_trace, c_move,
c_rotate
► latest
version online