FCL  0.6.0
Flexible Collision Library
OBB.h
1 /*
2  * Software License Agreement (BSD License)
3  *
4  * Copyright (c) 2011-2014, Willow Garage, Inc.
5  * Copyright (c) 2014-2016, Open Source Robotics Foundation
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * * Redistributions of source code must retain the above copyright
13  * notice, this list of conditions and the following disclaimer.
14  * * Redistributions in binary form must reproduce the above
15  * copyright notice, this list of conditions and the following
16  * disclaimer in the documentation and/or other materials provided
17  * with the distribution.
18  * * Neither the name of Open Source Robotics Foundation nor the names of its
19  * contributors may be used to endorse or promote products derived
20  * from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33  * POSSIBILITY OF SUCH DAMAGE.
34  */
35 
38 #ifndef FCL_BV_OBB_H
39 #define FCL_BV_OBB_H
40 
41 #include <iostream>
42 
43 #include "fcl/common/types.h"
44 #include "fcl/math/geometry.h"
45 
46 namespace fcl
47 {
48 
50 template <typename S_>
51 class OBB
52 {
53 public:
54 
55  using S = S_;
56 
62  Matrix3<S> axis;
63 
65  Vector3<S> To;
66 
68  Vector3<S> extent;
69 
71  OBB();
72 
74  OBB(const Matrix3<S>& axis,
75  const Vector3<S>& center,
76  const Vector3<S>& extent);
77 
79  bool overlap(const OBB<S>& other) const;
80 
82  bool overlap(const OBB<S>& other, OBB<S>& overlap_part) const;
83 
85  bool contain(const Vector3<S>& p) const;
86 
88  OBB<S>& operator +=(const Vector3<S>& p);
89 
91  OBB<S>& operator += (const OBB<S>& other);
92 
94  OBB<S> operator + (const OBB<S>& other) const;
95 
97  S width() const;
98 
100  S height() const;
101 
103  S depth() const;
104 
106  S volume() const;
107 
109  S size() const;
110 
112  const Vector3<S> center() const;
113 
115  S distance(const OBB& other, Vector3<S>* P = nullptr,
116  Vector3<S>* Q = nullptr) const;
117 
118  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
119 
120 };
121 
122 using OBBf = OBB<float>;
123 using OBBd = OBB<double>;
124 
126 template <typename S>
127 void computeVertices(const OBB<S>& b, Vector3<S> vertices[8]);
128 
130 template <typename S>
131 OBB<S> merge_largedist(const OBB<S>& b1, const OBB<S>& b2);
132 
134 template <typename S>
135 OBB<S> merge_smalldist(const OBB<S>& b1, const OBB<S>& b2);
136 
138 template <typename S, typename Derived>
140  const OBB<S>& bv, const Eigen::MatrixBase<Derived>& t);
141 
144 template <typename S, typename DerivedA, typename DerivedB>
145 bool overlap(const Eigen::MatrixBase<DerivedA>& R0,
146  const Eigen::MatrixBase<DerivedB>& T0,
147  const OBB<S>& b1, const OBB<S>& b2);
148 
152 template <typename S>
153 bool obbDisjoint(
154  const Matrix3<S>& B,
155  const Vector3<S>& T,
156  const Vector3<S>& a,
157  const Vector3<S>& b);
158 
162 template <typename S>
163 bool obbDisjoint(
164  const Transform3<S>& tf,
165  const Vector3<S>& a,
166  const Vector3<S>& b);
167 
168 } // namespace fcl
169 
170 #include "fcl/math/bv/OBB-inl.h"
171 
172 #endif
S volume() const
Volume of the OBB.
Definition: OBB-inl.h:195
OBB< S > & operator+=(const Vector3< S > &p)
A simple way to merge the OBB and a point (the result is not compact).
Definition: OBB-inl.h:138
Main namespace.
Definition: broadphase_bruteforce-inl.h:45
S distance(const OBB &other, Vector3< S > *P=nullptr, Vector3< S > *Q=nullptr) const
Distance between two OBBs, not implemented.
Definition: OBB-inl.h:216
AABB< S > translate(const AABB< S > &aabb, const Eigen::MatrixBase< Derived > &t)
translate the center of AABB by t
Definition: AABB-inl.h:345
bool contain(const Vector3< S > &p) const
Check whether the OBB contains a point.
Definition: OBB-inl.h:118
S width() const
Width of the OBB.
Definition: OBB-inl.h:174
bool overlap(const OBB< S > &other) const
Check collision between two OBB, return true if collision happens.
Definition: OBB-inl.h:96
OBB< S > operator+(const OBB< S > &other) const
Return the merged OBB of current OBB and the other one (the result is not compact).
Definition: OBB-inl.h:157
Vector3< S > extent
Half dimensions of OBB.
Definition: OBB.h:68
Matrix3< S > axis
Orientation of OBB. The axes of the rotation matrix are the principle directions of the box...
Definition: OBB.h:62
S size() const
Size of the OBB (used in BV_Splitter to order two OBBs)
Definition: OBB-inl.h:202
const Vector3< S > center() const
Center of the OBB.
Definition: OBB-inl.h:209
S depth() const
Depth of the OBB.
Definition: OBB-inl.h:188
OBB()
Constructor.
Definition: OBB-inl.h:79
Vector3< S > To
Center of OBB.
Definition: OBB.h:65
S height() const
Height of the OBB.
Definition: OBB-inl.h:181
Oriented bounding box class.
Definition: OBB.h:51