Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

13.12.2003, 17:59

Kollisionserkennung

Hi,

ich hab hier auf der Homepage das Kollisionstutorial in mein Spiel eingebaut.

Quellcode

1
2
3
4
5
6
7
hit = m_pSceneNode->LineHitsTriangle(
                                                start,     // Streckenstartpunkt
                                                end,     // Streckenendpunkt
                                                pVert[j*3+0], // Die drei Dreieckspunkte
                                                pVert[j*3+1],
                                                pVert[j*3+2],
                                                NULL);  // Ausgabe: Schnittpunkt


So gehe ich alle Dreicke in meinem Level durch. Start ist die die Position der Kamera und End ist die Position der Kamera+Richtung der Kamera *100

so das passt ja auch theoretisch auch alles. Doch wenn ne Kollision sein müsste, dann wechselt er die ganze zeit zw. Kollision und nicht Kollision also, hit wird die ganze Zeit true und wieder false.
Wenn keine Kollision besteht, dann stimmt auch alles, dann ist hit die ganze Zeit lang false.

Also warum "flackert" die Kollisionserkennung die ganze Zeit, wenn sie true sein müsste? Noch was, sie flackert außerdem nur, wenn sich die end oder start punkte verändern. Also wenn sich nix bewegt stimmts auch wieder. Und an den start und end werten kanns eigentlich nicht liegen...woran dann?

MFG Claudio

2

13.12.2003, 22:31

wäre nett, wenn ihr mir schnell helfen könnt ... :huhu:

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

13.12.2003, 23:16

Teste doch mal ein paar "Standardsituationen", also ein Dreieck, wo Du genau weißt, dass eine Kollision stattfindet. Wenn Du dann irgendwann eine Situation gefunden hast, wo es falsch ausgewertet wird, kannst Du beginnen, den Fehler zu suchen.
Im Tutorial müsste eigentlich alles stimmen... 100%ige Garantie gibt's natürlich nicht.

4

14.12.2003, 10:05

also ich hab schonmal versucht die kamera und endpunkte folgendermaßen zu setzten:

also definiert

Quellcode

1
float testx,testy;

und dann beim testen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
testx+=0.1f;
testy+=0.1f;

//und jetzt passiert das:
//Variante1:
end = D3DXVECTOR3(0,0,100); //einfach nur zum Spass
start = D3DXVECTOR3(testx,testy,-100)//also die Kamera bewegt sich

---> Flimmern!

//und jetzt passiert das:
//Variante2:
end = D3DXVECTOR3(-testx,-testy,100); //Kamera bewegt sich genau in die andere Richtung
start = D3DXVECTOR3(testx,testy,-100)//also die Kamera bewegt sich

---> kein Flimmern


mit Flimmern mein ich natürlich nicht Bildschirmflimmern sondern, das ständige wechseln von true auf false usw.

Also so kann ich ausschliessen, dass es irgendwie an den Kamera-angaben liegt. Komisch ist, bei Variante 2, bewegt sich der Vektor ja um den Mittelpunkt...und da gibts kein flimmern :/

5

14.12.2003, 11:01

hmm es liegt nicht zufällig daran, dass ich alle Vector3D& in D3DXVECTOR3 und D3DXPLANE umgeschrieben hab oder?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

14.12.2003, 11:08

Nein, daran dürfte es nicht liegen...

7

14.12.2003, 11:11

und ist es normal das p.a p.b. und p.c immer 0 sind? und p.d bleibt auch bei jedem Durchgang gleich :/

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

14.12.2003, 11:32

Probier's mal mit der Funktion D3DXIntersectTri!
Alternativ hiermit:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// ******************************************************************
// Schnittpunkt zwischen einer Linie und einem Dreieck berechnen
TRIBASE_API BOOL tbLineHitsTriangle2(const tbVector3& vLineA,
                                     const tbVector3& vLineB,
                                     const tbVector3& vTriangleA,
                                     const tbVector3& vTriangleB,
                                     const tbVector3& vTriangleC,
                                     tbVector3* pvOut,              // = NULL
                                     tbVector2* pvOutBaryCentric)   // = NULL
{
    // Die Ebene dieses Dreiecks berechnen
    const tbPlane Plane(tbPlaneFromPoints(vTriangleA, vTriangleB, vTriangleC));

    // Schnittpunkt der Linie mit der Ebene bestimmen
    tbVector3 vIntersection;
    if(!tbLineHitsPlane(vLineA, vLineB, Plane, &vIntersection))
    {
        // Sie schneidet die Ebene nicht - dann kann sie das Dreieck
        // erst recht nicht schneiden.
        return FALSE;
    }

    // q, u und v berechnen
    const tbVector3 q(vIntersection - vTriangleA);
    const tbVector3 u(vTriangleB - vTriangleA);
    const tbVector3 v(vTriangleC - vTriangleA);

    // v' berechnen
    tbVector3 vTemp(tbVector3Cross(Plane.n, v));

    // Den s-Wert berechnen
    const float s = tbVector3Dot(q, vTemp) / tbVector3Dot(u, vTemp);

    // Wenn s kleiner als null ist, dann kann der Punkt nicht im Dreieck liegen.
    if(s < 0.0f) return FALSE;

    // u' und t berechnen
    vTemp = tbVector3Cross(Plane.n, u);
    const float t = tbVector3Dot(q, vTemp) / tbVector3Dot(v, vTemp);
    if(t < 0.0f) return FALSE;

    // Testen, ob die Summe kleiner größer als 1 ist
    if(s + t > 1.0f) return FALSE;

    // Der Punkt liegt im Dreieck! Auf Wunsch tragen wir die Koordinaten ein.
    if(pvOut != NULL) *pvOut = vIntersection;
    if(pvOutBaryCentric != NULL) *pvOutBaryCentric = tbVector2(s, t);

    return TRUE;
}

9

14.12.2003, 13:36

hmm geht nicht...sogar wenn end = start sagt er das das Zeugs kollidiert.

(Link)


also hier sieht man alles...ich kann dann überall rumfliegen, und die Vertexnummern bleiben immer gleich :/

komisch komisch...


und das mit D3DXIntersectTri(...) geht nicht. Krieg die Meldung das er den Bezeichner net kennt, obwohl laut:
http://msdn.microsoft.com/archive/defaul…ntersecttri.asp

ja alles passen müsste. Und wenn ich zum testen zB einfach ComputeNormals() hinschreib anstatt dem Intersect, dann kennt er den Befehl, also heisst das, dass auch alles richtig Included ist...warum geht das dann nicht?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

14.12.2003, 13:53

Also geht es mit D3DXIntersectTri auch nicht?
Dein Bild lässt sich übrigens nicht anzeigen, man muss sich erst irgendwo einloggen!?

Werbeanzeige