Add plNearestPoints, contribution from Blender
Thanks!
This commit is contained in:
@@ -163,9 +163,13 @@ extern "C" {
|
|||||||
|
|
||||||
/* Continuous Collision Detection API */
|
/* Continuous Collision Detection API */
|
||||||
|
|
||||||
|
// needed for source/blender/blenkernel/intern/collision.c
|
||||||
|
double plNearestPoints(float p1[3], float p2[3], float p3[3], float q1[3], float q2[3], float q3[3], float *pa, float *pb, float normal[3]);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#endif //BULLET_C_API_H
|
#endif //BULLET_C_API_H
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,27 @@ subject to the following restrictions:
|
|||||||
#include "btBulletDynamicsCommon.h"
|
#include "btBulletDynamicsCommon.h"
|
||||||
#include "LinearMath/btAlignedAllocator.h"
|
#include "LinearMath/btAlignedAllocator.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "LinearMath/btVector3.h"
|
||||||
|
#include "LinearMath/btScalar.h"
|
||||||
|
#include "LinearMath/btMatrix3x3.h"
|
||||||
|
#include "LinearMath/btTransform.h"
|
||||||
|
#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h"
|
||||||
|
#include "BulletCollision/CollisionShapes/btTriangleShape.h"
|
||||||
|
|
||||||
|
#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h"
|
||||||
|
#include "BulletCollision/NarrowPhaseCollision/btPointCollector.h"
|
||||||
|
#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h"
|
||||||
|
#include "BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h"
|
||||||
|
#include "BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h"
|
||||||
|
#include "BulletCollision/NarrowPhaseCollision/btGjkEpa.h"
|
||||||
|
#include "BulletCollision/CollisionShapes/btMinkowskiSumShape.h"
|
||||||
|
#include "BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h"
|
||||||
|
#include "BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h"
|
||||||
|
#include "BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h"
|
||||||
|
#include "LinearMath/btStackAlloc.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Create and Delete a Physics SDK
|
Create and Delete a Physics SDK
|
||||||
*/
|
*/
|
||||||
@@ -308,3 +329,72 @@ void plGetOrientation(plRigidBodyHandle object,plQuaternion orientation)
|
|||||||
//plRigidBodyHandle plRayCast(plDynamicsWorldHandle world, const plVector3 rayStart, const plVector3 rayEnd, plVector3 hitpoint, plVector3 normal);
|
//plRigidBodyHandle plRayCast(plDynamicsWorldHandle world, const plVector3 rayStart, const plVector3 rayEnd, plVector3 hitpoint, plVector3 normal);
|
||||||
|
|
||||||
// extern plRigidBodyHandle plObjectCast(plDynamicsWorldHandle world, const plVector3 rayStart, const plVector3 rayEnd, plVector3 hitpoint, plVector3 normal);
|
// extern plRigidBodyHandle plObjectCast(plDynamicsWorldHandle world, const plVector3 rayStart, const plVector3 rayEnd, plVector3 hitpoint, plVector3 normal);
|
||||||
|
|
||||||
|
double plNearestPoints(float p1[3], float p2[3], float p3[3], float q1[3], float q2[3], float q3[3], float *pa, float *pb, float normal[3])
|
||||||
|
{
|
||||||
|
btVector3 vp(p1[0], p1[1], p1[2]);
|
||||||
|
btTriangleShape trishapeA(vp,
|
||||||
|
btVector3(p2[0], p2[1], p2[2]),
|
||||||
|
btVector3(p3[0], p3[1], p3[2]));
|
||||||
|
trishapeA.setMargin(0.000001f);
|
||||||
|
btVector3 vq(q1[0], q1[1], q1[2]);
|
||||||
|
btTriangleShape trishapeB(vq,
|
||||||
|
btVector3(q2[0], q2[1], q2[2]),
|
||||||
|
btVector3(q3[0], q3[1], q3[2]));
|
||||||
|
trishapeB.setMargin(0.000001f);
|
||||||
|
|
||||||
|
// btVoronoiSimplexSolver sGjkSimplexSolver;
|
||||||
|
// btGjkEpaPenetrationDepthSolver penSolverPtr;
|
||||||
|
|
||||||
|
static btSimplexSolverInterface sGjkSimplexSolver;
|
||||||
|
sGjkSimplexSolver.reset();
|
||||||
|
|
||||||
|
static btGjkEpaPenetrationDepthSolver Solver0;
|
||||||
|
static btMinkowskiPenetrationDepthSolver Solver1;
|
||||||
|
|
||||||
|
btConvexPenetrationDepthSolver* Solver = NULL;
|
||||||
|
|
||||||
|
Solver = &Solver1;
|
||||||
|
|
||||||
|
btGjkPairDetector convexConvex(&trishapeA ,&trishapeB,&sGjkSimplexSolver,Solver);
|
||||||
|
|
||||||
|
convexConvex.m_catchDegeneracies = 1;
|
||||||
|
|
||||||
|
// btGjkPairDetector convexConvex(&trishapeA ,&trishapeB,&sGjkSimplexSolver,0);
|
||||||
|
|
||||||
|
btPointCollector gjkOutput;
|
||||||
|
btGjkPairDetector::ClosestPointInput input;
|
||||||
|
|
||||||
|
btStackAlloc gStackAlloc(1024*1024*2);
|
||||||
|
|
||||||
|
input.m_stackAlloc = &gStackAlloc;
|
||||||
|
|
||||||
|
btTransform tr;
|
||||||
|
tr.setIdentity();
|
||||||
|
|
||||||
|
input.m_transformA = tr;
|
||||||
|
input.m_transformB = tr;
|
||||||
|
|
||||||
|
convexConvex.getClosestPoints(input, gjkOutput, 0);
|
||||||
|
|
||||||
|
|
||||||
|
if (gjkOutput.m_hasResult)
|
||||||
|
{
|
||||||
|
|
||||||
|
pb[0] = pa[0] = gjkOutput.m_pointInWorld[0];
|
||||||
|
pb[1] = pa[1] = gjkOutput.m_pointInWorld[1];
|
||||||
|
pb[2] = pa[2] = gjkOutput.m_pointInWorld[2];
|
||||||
|
|
||||||
|
pb[0]+= gjkOutput.m_normalOnBInWorld[0] * gjkOutput.m_distance;
|
||||||
|
pb[1]+= gjkOutput.m_normalOnBInWorld[1] * gjkOutput.m_distance;
|
||||||
|
pb[2]+= gjkOutput.m_normalOnBInWorld[2] * gjkOutput.m_distance;
|
||||||
|
|
||||||
|
normal[0] = gjkOutput.m_normalOnBInWorld[0];
|
||||||
|
normal[1] = gjkOutput.m_normalOnBInWorld[1];
|
||||||
|
normal[2] = gjkOutput.m_normalOnBInWorld[2];
|
||||||
|
|
||||||
|
return gjkOutput.m_distance;
|
||||||
|
}
|
||||||
|
return -1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user