Strich/Dreieck Kollision -> Kollisionspunkt bestimmen
-
Hi! Ich habe mein Picking nun fertig, ich habe mich dabei am Picking-Example vom DX-SDK orientiert. Das Picking funktioniert einwandfrei, nun möchte ich aber nicht nur heraus bekommen ob ich ein Dreieck getroffen habe, sondern ich möchte auch herausfinden, wo genau ich es getroffen habe. Im Picking-Example steht eine Funktion wie man die Kollision von einem Dreieck mit einem Strahl testet und liefert die Texturcoordinaten zurück, wo ich das Dreieck getroffen habe. Ich brauche jedoch nicht die Texturcoordinaten, sondern die Position im 3D Raum.
Meine Funktion zum Testen sieht so aus:
bool IntersectTri(const Vector3<float>& orig, const Vector3<float>& dir, const Vector3<float>& v0, const Vector3<float>& v1, const Vector3<float>& v2, Vector3<float>* out) { Vector3<float> edge1 = v1 - v0; Vector3<float> edge2 = v2 - v0; Vector3<float> pvec = Vector3Cross(dir, edge2); float det = Vector3Dot(edge1, pvec); Vector3<float> tvec; if(det > 0) { tvec = orig - v0; } else { tvec = v0 - orig; det = -det; } if( det < 0.0001f ) return false; out->Y = Vector3Dot(tvec, pvec); if( out->Y < 0.0f || out->Y > det ) return false; Vector3<float> qvec = Vector3Cross(tvec, edge1); out->Z = Vector3Dot(dir, qvec); if(out->Z < 0.0f || out->Y + out->Z > det ) return false; out->X = Vector3Dot(edge2, qvec); float fInvDet = 1.0f / det; *out *= fInvDet; return true; }
Hat da jemand vieleicht eine Idee?
-
und liefert die Texturcoordinaten zurück
das stimmt nicht.
Ich brauche die Position im 3D Raum.
orig + dir * out->x
naechstes mal googlen.
-
Code-Walker schrieb:
Hat da jemand vieleicht eine Idee?
out ist die gewichtung auf deinem dreieck, theoretisch also
pos=v0*out->X+v1*out->Y+v2*out->Z;
wobei das fuer alle vertexdaten gemacht werden kann (du koenntest also auch normalen, texturcoordinaten und farben so interpolieren).
-
pos=v0*out->X+v1*out->Y+v2*out->Z;
ist richtig wenn out->X= 1-out->Y-out->Z, vgl Baryzentrische Koordinaten.
Hier ist out->X der Schnittpunkt im Koordinatensystem der Geraden (1D; Abstand zur Ebene vom Ortsvektor der Geraden entlang deren Richtungsvektors),
(out->Y, out->Z) ist der Schnittpunkt im Koordinatensystem des Dreiecks (2D) mit den Basen v1-v0 und v2-v0.