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

d00m

Frischling

  • »d00m« ist der Autor dieses Themas

Beiträge: 17

Wohnort: Bautzen

  • Private Nachricht senden

1

31.07.2007, 13:30

Kollisionsprobleme

Hi.
habe probleme mit der kollisionserkennung von 2 linien, in 3d.
bin das tutorial auf http://www.scherfgen-software.net/ durchgegangen, aber da kommen falsche werte raus!
ich hab zwar schon eine funktion zum errechnen des schnittpunktes, in 2D, aber da es, meiner meinung nach, sehr rechenaufwendig ist, wollte ich es verbessern.
auch weiß ich bei meiner momentanen funktion nicht, wie ich sei auf 3D erweitern kann.
kann mir vllt jemand weiterhelfen?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

31.07.2007, 13:33

Japp kein DIng. Müsstest nur den Code mal posten :)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

d00m

Frischling

  • »d00m« ist der Autor dieses Themas

Beiträge: 17

Wohnort: Bautzen

  • Private Nachricht senden

3

31.07.2007, 14:05

momentan ist er:

C-/C++-Quelltext

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
51
52
bool CollisionLine_Line(LINE line1, LINE line2, VECTOR_XYZ *sp)
{
    VECTOR_XY KollPoint;
    bool KoolX =false;
    bool KoolY=false;
    float s, t;
    // test für 2D ablauf -> 3D-Vektoren in 2D umwandeln

    VECTOR_XY A, B, C, D;
    make2Dvector(A, line1.v1);
    make2Dvector(B, line1.v2);
    make2Dvector(C, line2.v1);
    make2Dvector(D, line2.v2);
    // werte wurden in 2d-vektoren umgewandelt


    s=((A.y-C.y)*(D.x-C.x)-(A.x-C.x)*(D.y-C.y))/((B.x-A.x)*(D.y-C.y)-(B.y-A.y)*(D.x-C.x));
    t=((A.y-C.y)*(B.x-A.x)-(A.x-C.x)*(B.y-A.y))/((B.x-A.x)*(D.y-C.y)-(B.y-A.y)*(D.x-C.x));

    if(((B.x-A.x)*(D.y-C.y)-(B.y-A.y)*(D.x-C.x))==0)
        printf("geraden sind parallel\n");
    if(((A.y-C.y)*(D.x-C.x)-(A.x-C.x)*(D.y-C.y))==0)
        printf("geraden sind kollinear\n");
    if(0<=s && s<=1 && 0<=t && t<=1)
    {
        KollPoint=A+s*(B-A);
        if(B.x>=KollPoint.x && A.x<=KollPoint.x)
            KoolX=true;
        else
            return false;
        if(C.y>D.y)
        {
            if((B.y<=C.y || A.y<=C.y) && 
               (B.y>=D.y || A.y>=D.y))
                KoolY=true;
            else
                return false;
        }
        else
        {
            if((B.y<=D.y || A.y<=D.y) &&
               (B.y>=C.y || A.y>=C.y))
               KoolY=true;
            else
                return false;
        }
        if(KoolX==true && KoolY==true)
        {
            *sp=CreateVector(KollPoint.x, KollPoint.y, line1.v1.z);
            return true;
        }
    }
    return false;
}


sieht alles recht polnisch aus, da ichs erstma nur zum laufen bekommen woltle, da von vornherein klar war, das ich die kollisions-funktionen überabeite und alle in 3D umwandle
(hab erst alle in 2d gemacht, für die ersten tests)

4

31.07.2007, 17:29

die wahrscheinlichkeit das sich zwei linien im 3d raum schneiden ist gering. auch wenn sich zwei linien schneiden kann beim rechnen mit floating point numbers schnell mal die genauigkeit nicht ausreichen um die kollision festzustellen.

es wäre in dem fall wohl besser die kürzeste distanz zwischen den linien auszurechnen und mit einem definierten wert epsilon zu vergleichen um festzustellen ob eine kollision vorliegt (oder eben annähernd vorliegt).

die schlüsselidee dieses tests ist das die verbindungslinie mit der kürzesten distanz rechtwinkelig zu beiden linien ist. also punktprodukt von 0.
Always remember to keep yourself alive

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

01.08.2007, 16:06

Also für deine 2D Lösung: Da reicht es egtl zu prüfen ob die Richtungsvektoren parallel sind und ungleich.
@D13_Dreinig

Werbeanzeige