93 typedef typename TVector::TValue TValue;
94 typedef typename TVector::TNumTraits TNumTraits;
96 const TValue absX =
num::abs(iNormal.x);
97 const TValue absY =
num::abs(iNormal.y);
98 const TValue absZ =
num::abs(iNormal.z);
100 if (absZ > absX && absZ > absY)
102 const TVector j(TNumTraits::zero, TNumTraits::one, TNumTraits::zero);
103 oDirU = cross(j, iNormal);
104 oDirV = cross(iNormal, oDirU);
106 else if (absX > absY)
108 const TVector k(TNumTraits::zero, TNumTraits::zero, TNumTraits::one);
109 oDirU = cross(k, iNormal);
110 oDirV = cross(iNormal, oDirU);
114 const TVector i(TNumTraits::one, TNumTraits::zero, TNumTraits::zero);
115 oDirU = cross(i, iNormal);
116 oDirV = cross(iNormal, oDirU);
130 const typename Vector3D<T>::TValue dotUV = dot(iDirU, iDirV);
131 oReciprocalDirU = iDirU - iDirV * (dotUV / iDirV.
squaredNorm());
132 oReciprocalDirV = iDirV - iDirU * (dotUV / iDirU.
squaredNorm());
133 oReciprocalDirU /= dot(oReciprocalDirU, iDirU);
134 oReciprocalDirV /= dot(oReciprocalDirV, iDirV);