also erstmal: wenn du es theoretisch weißt, wo is dann das praxis problem?
Als erstes solltest du dir mal klar werden, wie du was repräsentierst in deinem Programm, vermutlich die Ebene in der Hess'schen Normalenform und die Gerade in der Parameterform
=>
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
|
struct Plane
{
float d;
float3 n;
};
struct Ray
{
float3 dir;
float3 pos;
};
|
Nun steht sicherlich in deinem Oberstufenmathebuch oder Wikipedia oder sonstige Formelsammlung wie man den Schnittpunkt zwischen Gerade/Ebene bestimmt!
In diesem Falle einfach die Definition für Gerade und Ebene anschauen:
Gerade: x = pos + t * dir -->wobei x ein punkt auf der gerade ist (parameterdarstellung)
Ebene: x dot n - d = 0 bzw. x dot n = d
-->zwei Gleichungen, wie löst man die? -->Antwort durch Einsetzen
also
(pos + t * dir) dot n = d -->Lösung Schnitt wenn ein t existiert
das ganze lässt sich programmiertechnisch noch mit ein paar Überlegungen beschleunigen, so existiert zum Beispiel kein t genau dann, wenn die Gerade parallel zur Ebene ist
Hier noch ein Quellcode ausschnitt den ich selbst verwende:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
|
float fVd = Dot(p.vNormal, r.vDirection);
//Ist der Strahl parallel zur Ebene
if( stAbs(fVd) < Epsilon)return false;
float fVo = -(Dot(p.vNormal, r.vOrigin) + p.d);
float _t = fVo / fVd;
return true;
|