Cheetah Software  1.0
CollisionBox.cpp
Go to the documentation of this file.
2 #include "Utilities/utilities.h"
3 
9 template <typename T>
10 bool CollisionBox<T>::ContactDetection(const Vec3<T>& cp_pos, T& penetration,
11  Mat3<T>& cp_frame) {
12  Vec3<T> center2cp_local = _orientation.transpose() * (cp_pos - _position);
13 
14  bool inside_box(true);
15  T err[3] = {0};
16  for (size_t i(0); i < 3; ++i) {
17  // Outside to the positive direction
18  if (center2cp_local[i] > _size[i] / 2.) {
19  inside_box = false;
20  }
21  // Outside to the negative direction
22  else if (center2cp_local[i] < -_size[i] / 2.) {
23  inside_box = false;
24  }
25  // Distance from surface
26  else {
27  err[i] = _size[i] / 2. - std::abs(center2cp_local[i]);
28  }
29  }
30 
31  if (inside_box) {
32  if (err[2] < std::min(err[0], err[1])) { // Contact on Z surface
33  if (center2cp_local[2] > 0.) {
34  cp_frame = _orientation;
35  } else {
36  cp_frame = -_orientation;
37  }
38  penetration = -err[2];
39  } else if (err[1] < std::min(err[0], err[2])) { // Contact on Y surface
40  if (center2cp_local[1] > 0.) {
41  // X -->X
42  cp_frame.template block<3, 1>(0, 0) =
43  _orientation.template block<3, 1>(0, 0);
44  // -Z --> Y
45  cp_frame.template block<3, 1>(0, 1) =
46  -_orientation.template block<3, 1>(0, 2);
47  // Y --> Z
48  cp_frame.template block<3, 1>(0, 2) =
49  _orientation.template block<3, 1>(0, 1);
50  } else {
51  // X --> X
52  cp_frame.template block<3, 1>(0, 0) =
53  _orientation.template block<3, 1>(0, 0);
54  // Z --> Y
55  cp_frame.template block<3, 1>(0, 1) =
56  _orientation.template block<3, 1>(0, 2);
57  // -Y --> Z
58  cp_frame.template block<3, 1>(0, 2) =
59  -_orientation.template block<3, 1>(0, 1);
60  }
61  penetration = -err[1];
62  } else { // contact on X surface
63  if (center2cp_local[0] > 0.) {
64  // X -->X
65  cp_frame.template block<3, 1>(0, 0) =
66  _orientation.template block<3, 1>(0, 1);
67  // -Z --> Y
68  cp_frame.template block<3, 1>(0, 1) =
69  -_orientation.template block<3, 1>(0, 2);
70  // Y --> Z
71  cp_frame.template block<3, 1>(0, 2) =
72  _orientation.template block<3, 1>(0, 0);
73  } else {
74  // X -->X
75  cp_frame.template block<3, 1>(0, 0) =
76  _orientation.template block<3, 1>(0, 0);
77  // -Z --> Y
78  cp_frame.template block<3, 1>(0, 1) =
79  _orientation.template block<3, 1>(0, 1);
80  // Y --> Z
81  cp_frame.template block<3, 1>(0, 2) =
82  -_orientation.template block<3, 1>(0, 0);
83  }
84  penetration = -err[0];
85  }
86  return true;
87  }
88  return false;
89 }
90 
91 template class CollisionBox<double>;
92 template class CollisionBox<float>;
typename Eigen::Matrix< T, 3, 3 > Mat3
Definition: cppTypes.h:54
typename Eigen::Matrix< T, 3, 1 > Vec3
Definition: cppTypes.h:26
virtual bool ContactDetection(const Vec3< T > &cp_pos, T &penetration, Mat3< T > &cp_frame)
Collision logic for a box.