Bullet Collision Detection & Physics Library
btTransform.h
Go to the documentation of this file.
1 /*
2 Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans http://continuousphysics.com/Bullet/
3 
4 This software is provided 'as-is', without any express or implied warranty.
5 In no event will the authors be held liable for any damages arising from the use of this software.
6 Permission is granted to anyone to use this software for any purpose,
7 including commercial applications, and to alter it and redistribute it freely,
8 subject to the following restrictions:
9 
10 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
11 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
12 3. This notice may not be removed or altered from any source distribution.
13 */
14 
15 
16 
17 #ifndef BT_TRANSFORM_H
18 #define BT_TRANSFORM_H
19 
20 
21 #include "btMatrix3x3.h"
22 
23 #ifdef BT_USE_DOUBLE_PRECISION
24 #define btTransformData btTransformDoubleData
25 #else
26 #define btTransformData btTransformFloatData
27 #endif
28 
29 
30 
31 
35 
40 
41 public:
42 
49  const btVector3& c = btVector3(btScalar(0), btScalar(0), btScalar(0)))
50  : m_basis(q),
51  m_origin(c)
52  {}
53 
58  const btVector3& c = btVector3(btScalar(0), btScalar(0), btScalar(0)))
59  : m_basis(b),
60  m_origin(c)
61  {}
64  : m_basis(other.m_basis),
65  m_origin(other.m_origin)
66  {
67  }
70  {
71  m_basis = other.m_basis;
72  m_origin = other.m_origin;
73  return *this;
74  }
75 
76 
81  SIMD_FORCE_INLINE void mult(const btTransform& t1, const btTransform& t2) {
82  m_basis = t1.m_basis * t2.m_basis;
83  m_origin = t1(t2.m_origin);
84  }
85 
86 /* void multInverseLeft(const btTransform& t1, const btTransform& t2) {
87  btVector3 v = t2.m_origin - t1.m_origin;
88  m_basis = btMultTransposeLeft(t1.m_basis, t2.m_basis);
89  m_origin = v * t1.m_basis;
90  }
91  */
92 
95  {
96  return x.dot3(m_basis[0], m_basis[1], m_basis[2]) + m_origin;
97  }
98 
101  {
102  return (*this)(x);
103  }
104 
107  {
108  return getRotation() * q;
109  }
110 
112  SIMD_FORCE_INLINE btMatrix3x3& getBasis() { return m_basis; }
114  SIMD_FORCE_INLINE const btMatrix3x3& getBasis() const { return m_basis; }
115 
117  SIMD_FORCE_INLINE btVector3& getOrigin() { return m_origin; }
119  SIMD_FORCE_INLINE const btVector3& getOrigin() const { return m_origin; }
120 
123  btQuaternion q;
124  m_basis.getRotation(q);
125  return q;
126  }
127 
128 
132  {
133  m_basis.setFromOpenGLSubMatrix(m);
134  m_origin.setValue(m[12],m[13],m[14]);
135  }
136 
139  void getOpenGLMatrix(btScalar *m) const
140  {
141  m_basis.getOpenGLSubMatrix(m);
142  m[12] = m_origin.x();
143  m[13] = m_origin.y();
144  m[14] = m_origin.z();
145  m[15] = btScalar(1.0);
146  }
147 
150  SIMD_FORCE_INLINE void setOrigin(const btVector3& origin)
151  {
152  m_origin = origin;
153  }
154 
155  SIMD_FORCE_INLINE btVector3 invXform(const btVector3& inVec) const;
156 
157 
160  {
161  m_basis = basis;
162  }
163 
166  {
167  m_basis.setRotation(q);
168  }
169 
170 
172  void setIdentity()
173  {
174  m_basis.setIdentity();
175  m_origin.setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0));
176  }
177 
181  {
182  m_origin += m_basis * t.m_origin;
183  m_basis *= t.m_basis;
184  return *this;
185  }
186 
189  {
190  btMatrix3x3 inv = m_basis.transpose();
191  return btTransform(inv, inv * -m_origin);
192  }
193 
197  btTransform inverseTimes(const btTransform& t) const;
198 
200  btTransform operator*(const btTransform& t) const;
201 
203  static const btTransform& getIdentity()
204  {
205  static const btTransform identityTransform(btMatrix3x3::getIdentity());
206  return identityTransform;
207  }
208 
209  void serialize(struct btTransformData& dataOut) const;
210 
211  void serializeFloat(struct btTransformFloatData& dataOut) const;
212 
213  void deSerialize(const struct btTransformData& dataIn);
214 
215  void deSerializeDouble(const struct btTransformDoubleData& dataIn);
216 
217  void deSerializeFloat(const struct btTransformFloatData& dataIn);
218 
219 };
220 
221 
223 btTransform::invXform(const btVector3& inVec) const
224 {
225  btVector3 v = inVec - m_origin;
226  return (m_basis.transpose() * v);
227 }
228 
231 {
232  btVector3 v = t.getOrigin() - m_origin;
233  return btTransform(m_basis.transposeTimes(t.m_basis),
234  v * m_basis);
235 }
236 
239 {
240  return btTransform(m_basis * t.m_basis,
241  (*this)(t.m_origin));
242 }
243 
246 {
247  return ( t1.getBasis() == t2.getBasis() &&
248  t1.getOrigin() == t2.getOrigin() );
249 }
250 
251 
254 {
257 };
258 
260 {
263 };
264 
265 
266 
268 {
269  m_basis.serialize(dataOut.m_basis);
270  m_origin.serialize(dataOut.m_origin);
271 }
272 
274 {
275  m_basis.serializeFloat(dataOut.m_basis);
276  m_origin.serializeFloat(dataOut.m_origin);
277 }
278 
279 
281 {
282  m_basis.deSerialize(dataIn.m_basis);
283  m_origin.deSerialize(dataIn.m_origin);
284 }
285 
287 {
288  m_basis.deSerializeFloat(dataIn.m_basis);
289  m_origin.deSerializeFloat(dataIn.m_origin);
290 }
291 
293 {
294  m_basis.deSerializeDouble(dataIn.m_basis);
295  m_origin.deSerializeDouble(dataIn.m_origin);
296 }
297 
298 
299 #endif //BT_TRANSFORM_H
300 
301 
302 
303 
304 
305