SGRay(const SGVec3<T>& origin, const SGVec3<T>& dir) :
_origin(origin), _direction(dir)
{ }
+ template<typename S>
+ explicit SGRay(const SGRay<S>& ray) :
+ _origin(ray.getOrigin()), _direction(ray.getDirection())
+ { }
void set(const SGVec3<T>& origin, const SGVec3<T>& dir)
{ _origin = origin; _direction = dir; }
SGVec3<T> getNormalizedDirection() const
{ return normalize(getDirection()); }
+ SGVec3<T> getClosestPointTo(const SGVec3<T>& point)
+ {
+ SGVec3<T> u(getNormalizedDirection()),
+ v(point - _origin);
+ return (dot(u, v) * u) + _origin;
+ }
private:
SGVec3<T> _origin;
SGVec3<T> _direction;