12#ifndef TT_INCLUDE_OBBOXCLASS_H
13#define TT_INCLUDE_OBBOXCLASS_H
23 OBBoxClass(
const OBBoxClass & that) : Basis(that.Basis),Center(that.Center),Extent(that.Extent)
26 OBBoxClass(
const Vector3 & center,
const Vector3 & extent) : Basis(1),Center(center),Extent(extent)
29 OBBoxClass(
const Vector3 & center,
const Vector3 & extent,
const Matrix3 & basis) : Basis(basis),Center(center),Extent(extent)
33 OBBoxClass(
const Vector3& aabb_center,
const Vector3& aabb_extent,
const Matrix3D& transform):
34 Center(transform * aabb_center),
40 OBBoxClass(
const Vector3 * points,
int num_points);
41 bool operator== (
const OBBoxClass &src)
43 return (Center == src.Center) && (Extent == src.Extent) && (Basis == src.Basis);
45 bool operator!= (
const OBBoxClass &src)
47 return (Center != src.Center) || (Extent != src.Extent) && (Basis == src.Basis);
49 void Init_From_Box_Points(Vector3 * points,
int num_points);
50 void Init_Random(
float min_extent = 0.5f,
float max_extent = 1.0f);
51 float Project_To_Axis(
const Vector3 & axis)
const
53 float x = Extent[0] * Vector3::Dot_Product(axis,Vector3(Basis[0][0],Basis[1][0],Basis[2][0]));
54 float y = Extent[1] * Vector3::Dot_Product(axis,Vector3(Basis[0][1],Basis[1][1],Basis[2][1]));
55 float z = Extent[2] * Vector3::Dot_Product(axis,Vector3(Basis[0][2],Basis[1][2],Basis[2][2]));
56 return (WWMath::Fabs(x) + WWMath::Fabs(y) + WWMath::Fabs(z));
58 float Volume(
void)
const
60 return 2.0f*Extent.X * 2.0f*Extent.Y * 2.0f*Extent.Z;
62 void Compute_Point(
float params[3],Vector3 * set_point)
const
64 Vector3 point = Extent;
68 Matrix3::Rotate_Vector(Basis,point,set_point);
69 Vector3::Add(Center,*set_point,set_point);
71 void Compute_Axis_Aligned_Extent(Vector3 * set_extent)
const
73 set_extent->X = WWMath::Fabs(Extent[0] * Basis[0][0]) + WWMath::Fabs(Extent[1] * Basis[0][1]) + WWMath::Fabs(Extent[2] * Basis[0][2]);
74 set_extent->Y = WWMath::Fabs(Extent[0] * Basis[1][0]) + WWMath::Fabs(Extent[1] * Basis[1][1]) + WWMath::Fabs(Extent[2] * Basis[1][2]);
75 set_extent->Z = WWMath::Fabs(Extent[0] * Basis[2][0]) + WWMath::Fabs(Extent[1] * Basis[2][1]) + WWMath::Fabs(Extent[2] * Basis[2][2]);
80 static void Transform(
const Matrix3D & tm,
const OBBoxClass & in,OBBoxClass * out)
82 out->Extent = in.Extent;
83 Matrix3D::Transform_Vector(tm,in.Center,&(out->Center));
84 Matrix3::Multiply(tm,in.Basis,&(out->Basis));
87 float ComputeSquaredDistanceFromPoint(
const Vector3& point)
89 Vector3 v = point - Center;
92 for (
int i = 0; i < 3; ++i)
94 float d = Vector3::Dot_Product(v, Basis[i]);
97 if (d < -Extent[i]) excess = d + Extent[i];
98 else if (d > Extent[i]) excess = d - Extent[i];
101 sq_dist += excess * excess;