Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
Delphi 11 Alexandria
|
3D Ray-Plane Intersection
29. Apr 2016, 10:10
Hallo,
ich habe hier im Forum diese funktion gefunden um den Schnittpunkt eines Graden und einer Form im 3D Raum zu berechnen.
Delphi-Quellcode:
function intersectPlaneLine(const planeA, planeB, planeC: TPoint3D;
const lineA, lineB: TPoint3D): TPoint3D;
var
AB, AC: TPoint3D;
planeNormal: TPoint3D;
DE: TPoint3D;
d, t: Single;
divisor: Single;
begin
// 1a
AB := Point3D(planeB.X - planeA.X, planeB.Y - planeA.Y, planeB.Z - planeA.Z);
AC := Point3D(planeC.X - planeA.X, planeC.Y - planeA.Y, planeC.Z - planeA.Z);
// 1b
// Kreuzprodukt (siehe Wikipedia, sofern nicht verständlich)
planeNormal := Point3D(AB.Y*AC.Z - AB.Z*AC.Y, AB.Z*AC.X - AB.X*AC.Z, AB.X*AC.Y - AB.Y*AC.X);
d := planeA.X*planeNormal.X + planeA.Y*planeNormal.Y + planeA.Z*planeNormal.Z;
// 2a
DE := Point3D(lineB.X - lineA.X, lineB.Y - lineA.Y, lineB.Z - lineA.Z);
// 3
divisor := planeNormal.X*DE.X + planeNormal.Y*DE.Y + planeNormal.Z*DE.Z;
if divisor = 0 then
// die Gerade steht 90° zur Ebenennormale --> sie ist parallel
// Lösung: keine oder unendlich viele - wir liefern niks
Result := Point3D(0, 0, 0)
else
begin
t := (d - planeNormal.X*lineA.X - planeNormal.Y*lineA.Y - planeNormal.Z*lineA.Z) / divisor;
// 4
Result := Point3D(lineA.X + t*DE.X, lineA.Y + t*DE.Y, lineA.Z + t*DE.Z);
end;
end;
Diese funktioniert einwandfrei, jedoch gibt es mir auch Werte aus wenn kein Schnittpunkt dazwischen liegt.
z.B. das:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
LPoint : TPoint3D;
begin
LPoint := intersectPlaneLine(
Point3d(100,100,100),
Point3d(200,200,100),
Point3d(200,100,100),
Point3d(0,0,-1000),
Point3d(0,0,1000)
)
end;
bekomme ich Point3D(0,0,100) zurück obwohl da gar nichts liegen sollte? Komisch ist das die Z Achse korrekt ist. Wo ist da der Wurm drin?
MfG
Milos
|
|
Zitat
|