Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/*
* Software License Agreement (BSD License)
*
* Copyright (c) 2011, Willow Garage, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of Willow Garage, Inc. nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/** \author Jia Pan */
#ifndef FCL_COLLISION_OBJECT_BASE_H
#define FCL_COLLISION_OBJECT_BASE_H
#include "fcl/math/transform.h"
jpan
committed
#include <boost/shared_ptr.hpp>
/// @brief object type: BVH (mesh, points), basic geometry, octree
enum OBJECT_TYPE {OT_UNKNOWN, OT_BVH, OT_GEOM, OT_OCTREE, OT_COUNT};
/// @brief traversal node type: bounding volume (AABB, OBB, RSS, kIOS, OBBRSS, KDOP16, KDOP18, kDOP24), basic shape (box, sphere, capsule, cone, cylinder, convex, plane, triangle), and octree
enum NODE_TYPE {BV_UNKNOWN, BV_AABB, BV_OBB, BV_RSS, BV_kIOS, BV_OBBRSS, BV_KDOP16, BV_KDOP18, BV_KDOP24,
GEOM_BOX, GEOM_SPHERE, GEOM_CAPSULE, GEOM_CONE, GEOM_CYLINDER, GEOM_CONVEX, GEOM_PLANE, GEOM_HALFSPACE, GEOM_TRIANGLE, GEOM_OCTREE, NODE_COUNT};
/// @brief The geometry for the object for collision or distance computation
jpan
committed
class CollisionGeometry
{
public:
CollisionGeometry() : cost_density(1),
threshold_occupied(1),
threshold_free(0)
jpan
committed
virtual ~CollisionGeometry() {}
jpan
committed
virtual OBJECT_TYPE getObjectType() const { return OT_UNKNOWN; }
jpan
committed
virtual NODE_TYPE getNodeType() const { return BV_UNKNOWN; }
/// @brief compute the AABB for object in local coordinate
jpan
committed
virtual void computeLocalAABB() = 0;
void* getUserData() const
{
return user_data;
}
void setUserData(void *data)
{
user_data = data;
}
/// @brief whether the object is completely occupied
inline bool isOccupied() const { return cost_density >= threshold_occupied; }
/// @brief whether the object is completely free
inline bool isFree() const { return cost_density <= threshold_free; }
/// @brief whether the object has some uncertainty
inline bool isUncertain() const { return !isOccupied() && !isFree(); }
jpan
committed
Vec3f aabb_center;
/// @brief AABB in local coordinate, used for tight AABB when only translation transform
/// @brief pointer to user defined data specific to this object
/// @brief threshold for occupied ( >= is occupied)
/// @brief threshold for free (<= is free)
jpan
committed
};
/// @brief the object for collision or distance computation, contains the geometry and the transform information
CollisionObject(const boost::shared_ptr<CollisionGeometry> &cgeom_) : cgeom(cgeom_)
jpan
committed
{
cgeom->computeLocalAABB();
jpan
committed
}
CollisionObject(const boost::shared_ptr<CollisionGeometry> &cgeom_, const Transform3f& tf) : cgeom(cgeom_), t(tf)
jpan
committed
{
cgeom->computeLocalAABB();
jpan
committed
}
CollisionObject(const boost::shared_ptr<CollisionGeometry> &cgeom_, const Matrix3f& R, const Vec3f& T):
jpan
committed
{
cgeom->computeLocalAABB();
jpan
committed
}
CollisionObject()
{
}
~CollisionObject()
{
}
jpan
committed
OBJECT_TYPE getObjectType() const
{
return cgeom->getObjectType();
}
jpan
committed
NODE_TYPE getNodeType() const
{
return cgeom->getNodeType();
}
jpan
committed
inline const AABB& getAABB() const
{
return aabb;
}
/// @brief compute the AABB in world space
jpan
committed
inline void computeAABB()
{
if(t.getQuatRotation().isIdentity())
{
}
else
{
Vec3f center = t.transform(cgeom->aabb_center);
aabb.min_ = center - delta;
aabb.max_ = center + delta;
}
jpan
committed
}
jpan
committed
void* getUserData() const
{
return user_data;
}
jpan
committed
void setUserData(void *data)
{
user_data = data;
}
jpan
committed
inline const Vec3f& getTranslation() const
{
return t.getTranslation();
}
/// @brief get matrix rotation of the object
jpan
committed
inline const Matrix3f& getRotation() const
{
return t.getRotation();
}
/// @brief get quaternion rotation of the object
inline const Quaternion3f& getQuatRotation() const
jpan
committed
{
return t.getQuatRotation();
}
inline const Transform3f& getTransform() const
jpan
committed
{
return t;
}
jpan
committed
void setRotation(const Matrix3f& R)
{
t.setRotation(R);
}
jpan
committed
void setTranslation(const Vec3f& T)
{
t.setTranslation(T);
}
/// @brief set object's quatenrion rotation
void setQuatRotation(const Quaternion3f& q)
jpan
committed
{
t.setQuatRotation(q);
}
jpan
committed
void setTransform(const Matrix3f& R, const Vec3f& T)
{
t.setTransform(R, T);
}
void setTransform(const Quaternion3f& q, const Vec3f& T)
jpan
committed
{
t.setTransform(q, T);
}
void setTransform(const Transform3f& tf)
jpan
committed
{
t = tf;
}
/// @brief whether the object is in local coordinate
jpan
committed
bool isIdentityTransform() const
{
return t.isIdentity();
}
/// @brief set the object in local coordinate
jpan
committed
void setIdentityTransform()
{
t.setIdentity();
}
/// @brief get geometry from the object instance
jpan
committed
const CollisionGeometry* getCollisionGeometry() const
{
return cgeom.get();
}
/// @brief whether the object is completely occupied
{
return cgeom->isOccupied();
}
/// @brief whether the object is completely free
{
return cgeom->isFree();
}
/// @brief whether the object is uncertain
jpan
committed
protected:
boost::shared_ptr<CollisionGeometry> cgeom;
jpan
committed
jpan
committed
mutable AABB aabb;
/// @brief pointer to user defined data specific to this object
jpan
committed
void *user_data;
};