1 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
3 * Contains code for rays.
5 * \author Pierre Terdiman
8 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
10 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
13 * A ray is a half-line P(t) = mOrig + mDir * t, with 0 <= t <= +infinity
15 * \author Pierre Terdiman
18 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
21 O = Origin = impact point
22 i = normalized vector along the x axis
23 j = normalized vector along the y axis = actually the normal vector in O
24 D = Direction vector, norm |D| = 1
25 N = Projection of D on y axis, norm |N| = normal reaction
26 T = Projection of D on x axis, norm |T| = tangential reaction
40 _________\|/______*_______>x
43 Let define theta = angle between D and N. Then cos(theta) = |N| / |D| = |N| since D is normalized.
45 j|D = |j|*|D|*cos(theta) => |N| = j|D
51 To compute tangential reaction :
55 To compute reflexion vector :
57 R = N - T = N - (D-N) = 2*N - D
60 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
64 using namespace IceMaths
;
66 float Ray::SquareDistance(const Point
& point
, float* t
) const
68 Point Diff
= point
- mOrig
;
69 float fT
= Diff
| mDir
;
77 fT
/= mDir
.SquareMagnitude();
83 return Diff
.SquareMagnitude();