Added improved convex hull computation utility based on Preparata and Hong
Thanks to Ole Kniemeyer, MAXON, See also http://code.google.com/p/bullet/issues/detail?id=275 The ConvexHullDistanceDemo uses it to visualize the convex hull of a point cloud.
This commit is contained in:
@@ -15,9 +15,13 @@ IF (USE_GLUT)
|
|||||||
RagdollDemo ForkLiftDemo BasicDemo FractureDemo Box2dDemo BspDemo MovingConcaveDemo VehicleDemo
|
RagdollDemo ForkLiftDemo BasicDemo FractureDemo Box2dDemo BspDemo MovingConcaveDemo VehicleDemo
|
||||||
UserCollisionAlgorithm CharacterDemo SoftDemo HeightFieldFluidDemo
|
UserCollisionAlgorithm CharacterDemo SoftDemo HeightFieldFluidDemo
|
||||||
CollisionInterfaceDemo ConcaveConvexcastDemo SimplexDemo DynamicControlDemo
|
CollisionInterfaceDemo ConcaveConvexcastDemo SimplexDemo DynamicControlDemo
|
||||||
|
ConvexHullDistance
|
||||||
DoublePrecisionDemo ConcaveDemo CollisionDemo
|
DoublePrecisionDemo ConcaveDemo CollisionDemo
|
||||||
ContinuousConvexCollision ConcaveRaycastDemo GjkConvexCastDemo
|
ContinuousConvexCollision ConcaveRaycastDemo GjkConvexCastDemo
|
||||||
MultiMaterialDemo SerializeDemo InternalEdgeDemo
|
MultiMaterialDemo SerializeDemo InternalEdgeDemo
|
||||||
|
MultiThreadedDemo
|
||||||
|
ParticlesOpenCL
|
||||||
|
OpenCLClothDemo
|
||||||
)
|
)
|
||||||
ELSE()
|
ELSE()
|
||||||
SET(SharedDemoSubdirs
|
SET(SharedDemoSubdirs
|
||||||
@@ -29,10 +33,7 @@ IF (USE_GLUT)
|
|||||||
${SharedDemoSubdirs}
|
${SharedDemoSubdirs}
|
||||||
Benchmarks
|
Benchmarks
|
||||||
ThreadingDemo
|
ThreadingDemo
|
||||||
MultiThreadedDemo
|
|
||||||
VectorAdd_OpenCL
|
VectorAdd_OpenCL
|
||||||
ParticlesOpenCL
|
|
||||||
OpenCLClothDemo
|
|
||||||
)
|
)
|
||||||
ENDIF(GLUT_FOUND)
|
ENDIF(GLUT_FOUND)
|
||||||
ELSE (USE_GLUT)
|
ELSE (USE_GLUT)
|
||||||
|
|||||||
@@ -29,6 +29,24 @@ ELSE()
|
|||||||
)
|
)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
IF (WIN32)
|
||||||
|
IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES)
|
||||||
|
IF (CMAKE_CL_64)
|
||||||
|
ADD_CUSTOM_COMMAND(
|
||||||
|
TARGET AppCollisionDemo
|
||||||
|
POST_BUILD
|
||||||
|
COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/glut64.dll ${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
)
|
||||||
|
ELSE(CMAKE_CL_64)
|
||||||
|
ADD_CUSTOM_COMMAND(
|
||||||
|
TARGET AppCollisionDemo
|
||||||
|
POST_BUILD
|
||||||
|
COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/GLUT32.DLL ${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
)
|
||||||
|
ENDIF(CMAKE_CL_64)
|
||||||
|
ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES)
|
||||||
|
ENDIF(WIN32)
|
||||||
|
|
||||||
IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES)
|
IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES)
|
||||||
SET_TARGET_PROPERTIES(AppCollisionDemo PROPERTIES DEBUG_POSTFIX "_Debug")
|
SET_TARGET_PROPERTIES(AppCollisionDemo PROPERTIES DEBUG_POSTFIX "_Debug")
|
||||||
SET_TARGET_PROPERTIES(AppCollisionDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel")
|
SET_TARGET_PROPERTIES(AppCollisionDemo PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel")
|
||||||
|
|||||||
@@ -32,6 +32,61 @@ subject to the following restrictions:
|
|||||||
#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h"
|
#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h"
|
||||||
#include "BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h"
|
#include "BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h"
|
||||||
#include "LinearMath/btIDebugDraw.h"
|
#include "LinearMath/btIDebugDraw.h"
|
||||||
|
#include "LinearMath/btConvexHullComputer.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define TaruVtxCount 43
|
||||||
|
|
||||||
|
static float TaruVtx[] = {
|
||||||
|
1.08664f,-1.99237f,0.0f,
|
||||||
|
0.768369f,-1.99237f,-0.768369f,
|
||||||
|
1.28852f,1.34412e-007f,-1.28852f,
|
||||||
|
1.82224f,1.90735e-007f,0.0f,
|
||||||
|
0.0f,-1.99237f,-1.08664f,
|
||||||
|
0.0f,0.0f,-1.82224f,
|
||||||
|
0.0f,-1.99237f,-1.08664f,
|
||||||
|
-0.768369f,-1.99237f,-0.768369f,
|
||||||
|
-1.28852f,1.34412e-007f,-1.28852f,
|
||||||
|
0.0f,0.0f,-1.82224f,
|
||||||
|
-1.08664f,-1.99237f,1.82086e-007f,
|
||||||
|
-1.82224f,1.90735e-007f,1.59305e-007f,
|
||||||
|
-0.768369f,-1.99237f,0.76837f,
|
||||||
|
-1.28852f,2.47058e-007f,1.28852f,
|
||||||
|
1.42495e-007f,-1.99237f,1.08664f,
|
||||||
|
2.38958e-007f,2.70388e-007f,1.82224f,
|
||||||
|
0.768369f,-1.99237f,0.768369f,
|
||||||
|
1.28852f,2.47058e-007f,1.28852f,
|
||||||
|
0.768369f,1.99237f,-0.768369f,
|
||||||
|
1.08664f,1.99237f,0.0f,
|
||||||
|
0.0f,1.99237f,-1.08664f,
|
||||||
|
-0.768369f,1.99237f,-0.768369f,
|
||||||
|
0.0f,1.99237f,-1.08664f,
|
||||||
|
-1.08664f,1.99237f,0.0f,
|
||||||
|
-0.768369f,1.99237f,0.768369f,
|
||||||
|
1.42495e-007f,1.99237f,1.08664f,
|
||||||
|
0.768369f,1.99237f,0.768369f,
|
||||||
|
1.42495e-007f,-1.99237f,1.08664f,
|
||||||
|
-0.768369f,-1.99237f,0.76837f,
|
||||||
|
-1.08664f,-1.99237f,1.82086e-007f,
|
||||||
|
-0.768369f,-1.99237f,-0.768369f,
|
||||||
|
0.0f,-1.99237f,-1.08664f,
|
||||||
|
0.768369f,-1.99237f,-0.768369f,
|
||||||
|
1.08664f,-1.99237f,0.0f,
|
||||||
|
0.768369f,-1.99237f,0.768369f,
|
||||||
|
0.768369f,1.99237f,-0.768369f,
|
||||||
|
0.0f,1.99237f,-1.08664f,
|
||||||
|
-0.768369f,1.99237f,-0.768369f,
|
||||||
|
-1.08664f,1.99237f,0.0f,
|
||||||
|
-0.768369f,1.99237f,0.768369f,
|
||||||
|
1.42495e-007f,1.99237f,1.08664f,
|
||||||
|
0.768369f,1.99237f,0.768369f,
|
||||||
|
1.08664f,1.99237f,0.0f,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define USE_GJK
|
#define USE_GJK
|
||||||
|
|
||||||
@@ -72,7 +127,7 @@ void clientResetScene()
|
|||||||
tr[1].setOrigin(btVector3(0.0f,9.f,2.f));
|
tr[1].setOrigin(btVector3(0.0f,9.f,2.f));
|
||||||
}
|
}
|
||||||
|
|
||||||
int debugMode = 0;//btIDebugDraw::DBG_DrawWireframe;
|
int debugMode = btIDebugDraw::DBG_DrawWireframe;
|
||||||
GL_ShapeDrawer shapeDrawer;
|
GL_ShapeDrawer shapeDrawer;
|
||||||
int m_glutScreenWidth=0;
|
int m_glutScreenWidth=0;
|
||||||
int m_glutScreenHeight=0;
|
int m_glutScreenHeight=0;
|
||||||
@@ -188,13 +243,12 @@ int main(int argc,char** argv)
|
|||||||
tr[1].setBasis(basisB);
|
tr[1].setBasis(basisB);
|
||||||
|
|
||||||
btVector3 points0[3]={btVector3(1,0,0),btVector3(0,1,0),btVector3(0,0,1)};
|
btVector3 points0[3]={btVector3(1,0,0),btVector3(0,1,0),btVector3(0,0,1)};
|
||||||
btVector3 points1[5]={btVector3(1,0,0),btVector3(0,1,0),btVector3(0,0,1),btVector3(0,0,-1),btVector3(-1,-1,0)};
|
//btVector3 points1[5]={btVector3(1,0,0),btVector3(0,1,0),btVector3(0,0,1),btVector3(0,0,-1),btVector3(-1,-1,0)};
|
||||||
|
|
||||||
btConvexHullShape hullA(&points0[0].getX(),3);
|
btConvexHullShape hullA(&points0[0].getX(),3);
|
||||||
btConvexHullShape hullB(&points1[0].getX(),5);
|
btConvexHullShape hullB(TaruVtx,TaruVtxCount,3*sizeof(float));
|
||||||
btCylinderShape cylinder(btVector3(0.3,1,1));
|
|
||||||
|
|
||||||
shapePtr[0] = &cylinder;//hullA;
|
shapePtr[0] = &hullA;
|
||||||
shapePtr[1] = &hullB;
|
shapePtr[1] = &hullB;
|
||||||
|
|
||||||
|
|
||||||
@@ -209,6 +263,7 @@ int main(int argc,char** argv)
|
|||||||
static btVoronoiSimplexSolver sGjkSimplexSolver;
|
static btVoronoiSimplexSolver sGjkSimplexSolver;
|
||||||
btSimplexSolverInterface& gGjkSimplexSolver = sGjkSimplexSolver;
|
btSimplexSolverInterface& gGjkSimplexSolver = sGjkSimplexSolver;
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
void clientDisplay(void) {
|
void clientDisplay(void) {
|
||||||
@@ -291,7 +346,65 @@ void clientDisplay(void) {
|
|||||||
|
|
||||||
tr[i].getOpenGLMatrix( m );
|
tr[i].getOpenGLMatrix( m );
|
||||||
|
|
||||||
|
if (debugMode)
|
||||||
|
{
|
||||||
|
/// for polyhedral shapes
|
||||||
|
if (shapePtr[i]->isPolyhedral())
|
||||||
|
{
|
||||||
|
if (!shapePtr[i]->getUserPointer())
|
||||||
|
{
|
||||||
|
btConvexHullComputer* convexUtil = new btConvexHullComputer();
|
||||||
|
shapePtr[i]->setUserPointer(convexUtil);
|
||||||
|
|
||||||
|
btPolyhedralConvexShape* polyshape = (btPolyhedralConvexShape*) shapePtr[i];
|
||||||
|
|
||||||
|
btAlignedObjectArray<btVector3> vertices;
|
||||||
|
vertices.resize(polyshape->getNumVertices());
|
||||||
|
for (int i=0;i<polyshape->getNumVertices();i++)
|
||||||
|
{
|
||||||
|
polyshape->getVertex(i,vertices[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool useDoublePrecision = false;
|
||||||
|
convexUtil->compute(&vertices[0].getX(),sizeof(btVector3), polyshape->getNumVertices(),0,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shapePtr[i]->getUserPointer())
|
||||||
|
{
|
||||||
|
btConvexHullComputer* convexUtil = (btConvexHullComputer*)shapePtr[i]->getUserPointer();
|
||||||
|
//printf("num faces = %d\n",convexUtil->faces.size());
|
||||||
|
for (int j=0;j<convexUtil->faces.size();j++)
|
||||||
|
{
|
||||||
|
int face = convexUtil->faces[j];
|
||||||
|
//printf("face=%d\n",face);
|
||||||
|
const btConvexHullComputer::Edge* firstEdge = &convexUtil->edges[face];
|
||||||
|
const btConvexHullComputer::Edge* edge = firstEdge;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
int src = edge->getSourceVertex();
|
||||||
|
int targ = edge->getTargetVertex();
|
||||||
|
//printf("src=%d target = %d\n", src,targ);
|
||||||
|
|
||||||
|
btVector3 wa = tr[i] * convexUtil->vertices[src];
|
||||||
|
btVector3 wb = tr[i] * convexUtil->vertices[targ];
|
||||||
|
|
||||||
|
glBegin(GL_LINES);
|
||||||
|
glColor3f(1, 1, 1);
|
||||||
|
glVertex3f(wa.getX(),wa.getY(),wa.getZ());
|
||||||
|
glVertex3f(wb.getX(),wb.getY(),wb.getZ());
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
edge = edge->getNextEdgeOfFace();
|
||||||
|
} while (edge!=firstEdge);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
{
|
||||||
shapeDrawer.drawOpenGL(m,shapePtr[i],btVector3(1,1,1),debugMode, worldMin, worldMax);
|
shapeDrawer.drawOpenGL(m,shapePtr[i],btVector3(1,1,1),debugMode, worldMin, worldMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ INCLUDE_DIRECTORIES(
|
|||||||
SET(LinearMath_SRCS
|
SET(LinearMath_SRCS
|
||||||
btAlignedAllocator.cpp
|
btAlignedAllocator.cpp
|
||||||
btConvexHull.cpp
|
btConvexHull.cpp
|
||||||
|
btConvexHullComputer.cpp
|
||||||
btGeometryUtil.cpp
|
btGeometryUtil.cpp
|
||||||
btQuickprof.cpp
|
btQuickprof.cpp
|
||||||
btSerializer.cpp
|
btSerializer.cpp
|
||||||
@@ -16,6 +17,7 @@ SET(LinearMath_HDRS
|
|||||||
btAlignedAllocator.h
|
btAlignedAllocator.h
|
||||||
btAlignedObjectArray.h
|
btAlignedObjectArray.h
|
||||||
btConvexHull.h
|
btConvexHull.h
|
||||||
|
btConvexHullComputer.h
|
||||||
btDefaultMotionState.h
|
btDefaultMotionState.h
|
||||||
btGeometryUtil.h
|
btGeometryUtil.h
|
||||||
btHashMap.h
|
btHashMap.h
|
||||||
|
|||||||
2749
src/LinearMath/btConvexHullComputer.cpp
Normal file
2749
src/LinearMath/btConvexHullComputer.cpp
Normal file
File diff suppressed because it is too large
Load Diff
103
src/LinearMath/btConvexHullComputer.h
Normal file
103
src/LinearMath/btConvexHullComputer.h
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2011 Ole Kniemeyer, MAXON, www.maxon.net
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied warranty.
|
||||||
|
In no event will the authors be held liable for any damages arising from the use of this software.
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it freely,
|
||||||
|
subject to the following restrictions:
|
||||||
|
|
||||||
|
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.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _CONVEX_HULL_COMPUTER_H
|
||||||
|
#define _CONVEX_HULL_COMPUTER_H
|
||||||
|
|
||||||
|
#include "btVector3.h"
|
||||||
|
#include "btAlignedObjectArray.h"
|
||||||
|
|
||||||
|
/// Convex hull implementation based on Preparata and Hong
|
||||||
|
/// See http://code.google.com/p/bullet/issues/detail?id=275
|
||||||
|
/// Ole Kniemeyer, MAXON Computer GmbH
|
||||||
|
class btConvexHullComputer
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
btScalar compute(const void* coords, bool doubleCoords, int stride, int count, btScalar shrink, btScalar shrinkClamp);
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
class Edge
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
int next;
|
||||||
|
int reverse;
|
||||||
|
int targetVertex;
|
||||||
|
|
||||||
|
friend class btConvexHullComputer;
|
||||||
|
|
||||||
|
public:
|
||||||
|
int getSourceVertex() const
|
||||||
|
{
|
||||||
|
return (this + reverse)->targetVertex;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getTargetVertex() const
|
||||||
|
{
|
||||||
|
return targetVertex;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Edge* getNextEdgeOfVertex() const // counter-clockwise list of all edges of a vertex
|
||||||
|
{
|
||||||
|
return this + next;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Edge* getNextEdgeOfFace() const // clockwise list of all edges of a face
|
||||||
|
{
|
||||||
|
return (this + reverse)->getNextEdgeOfVertex();
|
||||||
|
}
|
||||||
|
|
||||||
|
const Edge* getReverseEdge() const
|
||||||
|
{
|
||||||
|
return this + reverse;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Vertices of the output hull
|
||||||
|
btAlignedObjectArray<btVector3> vertices;
|
||||||
|
|
||||||
|
// Edges of the output hull
|
||||||
|
btAlignedObjectArray<Edge> edges;
|
||||||
|
|
||||||
|
// Faces of the convex hull. Each entry is an index into the "edges" array pointing to an edge of the face. Faces are planar n-gons
|
||||||
|
btAlignedObjectArray<int> faces;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Compute convex hull of "count" vertices stored in "coords". "stride" is the difference in bytes
|
||||||
|
between the addresses of consecutive vertices. If "shrink" is positive, the convex hull is shrunken
|
||||||
|
by that amount (each face is moved by "shrink" length units towards the center along its normal).
|
||||||
|
If "shrinkClamp" is positive, "shrink" is clamped to not exceed "shrinkClamp * innerRadius", where "innerRadius"
|
||||||
|
is the minimum distance of a face to the center of the convex hull.
|
||||||
|
|
||||||
|
The returned value is the amount by which the hull has been shrunken. If it is negative, the amount was so large
|
||||||
|
that the resulting convex hull is empty.
|
||||||
|
|
||||||
|
The output convex hull can be found in the member variables "vertices", "edges", "faces".
|
||||||
|
*/
|
||||||
|
btScalar compute(const float* coords, int stride, int count, btScalar shrink, btScalar shrinkClamp)
|
||||||
|
{
|
||||||
|
return compute(coords, false, stride, count, shrink, shrinkClamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
// same as above, but double precision
|
||||||
|
btScalar compute(const double* coords, int stride, int count, btScalar shrink, btScalar shrinkClamp)
|
||||||
|
{
|
||||||
|
return compute(coords, true, stride, count, shrink, shrinkClamp);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif //_CONVEX_HULL_COMPUTER_H
|
||||||
|
|
||||||
Reference in New Issue
Block a user