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: