Hi David,
Ich glaub ich hab zwei Fehler in deinem Kollision-Tutorial Teil 2 gefunden.
1.: Du hast geschrieben, dass die Ebenengleichung ax + bx + cx + d = 0 ist. Müsste doch ax + by + cz + d = 0.
2.: Die Implementierung bLineHitsPlane()-Funktion müsste in den meisten Fällen (immer, wenn abs(fDenominator)>=0.0001 ist) FALSE zurückgeben.
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
if(fabsf(fDenominator) < 0.0001f)
{
// Liegt der Startpunkt der Strecke auf der Ebene? Wenn ja, dann liegt die
// gesamte Strecke auf ihr. Als Kollisionsort nehmen wir dann den Startpunkt.
if(fabsf(vLineA.x * Plane.a +
vLineA.y * Plane.b +
vLineA.z * Plane.c + Plane.d) < 0.0001f)
{
// Strecke liegt komplett auf der Ebene!
*pvOut = vLineA;
return TRUE;
}
}
else
{
// Keine Kollision!
return FALSE;
}
|
Stattdessen sollte es doch so heißen:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
if(fabsf(fDenominator) < 0.0001f)
{
// Liegt der Startpunkt der Strecke auf der Ebene? Wenn ja, dann liegt die
// gesamte Strecke auf ihr. Als Kollisionsort nehmen wir dann den Startpunkt.
if(fabsf(vLineA.x * Plane.a +
vLineA.y * Plane.b +
vLineA.z * Plane.c + Plane.d) < 0.0001f)
{
// Strecke liegt komplett auf der Ebene!
*pvOut = vLineA;
return TRUE;
}
else
{
// Keine Kollision!
return FALSE;
}
}
|
oder?
Gruß,
Jörg