- TR3DVector = record
- X,Y,Z : Single;
- end;
- TR3DLine = array [0..1] of TR3DVector;
- TR3DSphere = record
- Position : TR3DVector;
- Radius : Single;
- end;
- function r3d_VectorInterpolate(_Vector1, _Vector2: TR3DVector;
- Amt: Single): TR3DVector;
- begin
- Result.X := _Vector1.X + (_Vector2.X - _Vector1.X) * Amt;
- Result.Y := _Vector1.Y + (_Vector2.Y - _Vector1.Y) * Amt;
- Result.Z := _Vector1.Z + (_Vector2.Z - _Vector1.Z) * Amt;
- end;
- function r3d_VectorLength(V: TR3DVector): Single;
- begin
- Result := Sqrt(Sqr(V.X) + Sqr(V.Y) + Sqr(V.Z));
- end;
- function r3d_VectorDistance(_Vector1, _Vector2 : TR3DVector) : Single;
- begin
- Result := Sqrt(Sqr(_Vector1.x-_Vector2.x)+Sqr(_Vector1.y-_Vector2.y)+Sqr(_Vector1.z-_Vector2.z));
- end;
- function r3d_SphereLineIntersection(_Sphere : TR3DSphere; _Line : TR3DLine) : Boolean;
- var
- Middle : TR3DVector;
- Distance,
- LineLength,
- DistanceMinusLineLength : TR3DFloat;
- begin
- // Länge der Linie
- LineLength := r3d_VectorLength(r3d_VectorSub(_Line[0], _Line[1]));
- // Mitte der Linie rausfinden
- Middle := r3d_VectorInterpolate(_Line[0], _Line[1], 0.5);
- // Distance zwischen (Mitte der Linie) und (Kugel Position)
- Distance := r3d_VectorDistance(Middle, _Sphere.Position);
- // Distance minus Länge der Linie / 2
- DistanceMinusLineLength := Distance - (LineLength / 2);
- // Kollision wenn Distance sich im radius befindet.
- Result := (DistanceMinusLineLength < _Sphere.Radius);
- end;