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

31.12.2007, 01:57

Problem mit Kollision auf Dreiecksbasis: Strahl mit Mesh

Ich bin dabei, eine Kollisionsabfrage eines Strahls mit einem 3D-Mesh zusammenzubauen. Ich habe nun folgende Funktion vor mir liegen:

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
INDEX einfache_kollision::kollision( D3DXVECTOR3 *point, D3DXVECTOR3 *direction, float *dist) 
   { 
   INDEX ixhit; 
   float u, v, d; 
   int i; 

   *dist = 1e20f; 
   ixhit = NOINDEX; 

   for( i = 0; i < nfaces; i++) 
      { 
      if( D3DXIntersectTri( vertexbuffer + indexbuffer[i].vertex[0], 
                       vertexbuffer + indexbuffer[i].vertex[1], 
                       vertexbuffer + indexbuffer[i].vertex[2], point, direction, &u, &v, &d)) 
         { 
         if( d < *dist) 
            { 
            *dist = d; 
            ixhit = i; 
            } 
         } 
      } 
   return ixhit; 
   }


Diese Funktion durchläuft alle Vertizes und Indizes des Mesh, welches ich zuviel im Initialisieren des Objektes zwischengespeichert habe, und prüft für jedes "Face" die Kollision mit dem Strahl.
Als Parameter übergebe ich die Startposition den Richtungsvektor des Strahls. Der 3. Parameter soll die Entfernung vom nächsten kollidierenden Dreieck wiedergeben (kann ja passieren, dass ein Strahl mehrere Dreicke des Objektes schneidet )

Problem:
Bisher funktioniert die Kollisionsabfrage nur dann, wenn das Objekt noch nicht transformiert wurde (Rotation, Translation, Skalierung).


Ich habe jetzt folgenden Aufruf in etwa probiert:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
float iDist; 
int iTrefferindex; 

D3DXMATRIX invMat; 
D3DXMatrixInverse(&invMat, NULL, &Mesh.WorldMatrix ); 

D3DXVECTOR3 tempVec; 
D3DXVec3TransformNormal(&tempVec, &Camera.m_LookAt, &invMat); 

D3DXVECTOR3 vTemp = Camera.m_vPosition; 
iTrefferindex = Mesh.Kollision.kollision(&vTemp, &tempVec,&iDist);


Ich hatte nun vor, den Strahlvektor vom Betrachter mit der inversen Matrix vom Zielmesh zu multiplizieren und das Ergebnis aus Richtungsvektor an die Kollisionsabfragefunktion übergeben.
Hat aber nicht geklappt. :cry:

2

01.01.2008, 03:28

Ich habe einen Link gefunden der dir weiterhelfen wird. Interessanterweise war sein Problem sehr sehr ähnlich zu deinem.... :oops: :roll:

http://www.jliforum.de/board/viewtopic.php?t=5322&postdays=0&postorder=asc&start=0
Lieber dumm fragen, als dumm bleiben!

3

01.01.2008, 05:30

Ok, die Lösung steht in dem anderen Thread ;)

Werbeanzeige