void
btTriangleConvexcastCallback::processTriangle (btVector3* triangle, int partId, int triangleIndex)
{
		//BTREVIEW 0.6%
	
	btTriangleShape triangleShape (triangle[0], triangle[1], triangle[2]);
    triangleShape.setMargin(m_triangleCollisionMargin);

	btVoronoiSimplexSolver	simplexSolver;
	btGjkEpaPenetrationDepthSolver	gjkEpaPenetrationSolver;

//#define  USE_SUBSIMPLEX_CONVEX_CAST 1
//if you reenable USE_SUBSIMPLEX_CONVEX_CAST see commented out code below
#ifdef USE_SUBSIMPLEX_CONVEX_CAST
	btSubsimplexConvexCast convexCaster(m_convexShape, &triangleShape, &simplexSolver);
#else
	//btGjkConvexCast	convexCaster(m_convexShape,&triangleShape,&simplexSolver);
	btContinuousConvexCollision convexCaster(m_convexShape,&triangleShape,&simplexSolver,&gjkEpaPenetrationSolver);
#endif //#USE_SUBSIMPLEX_CONVEX_CAST
	
	btConvexCast::CastResult castResult;
	castResult.m_fraction = btScalar(1.);
	castResult.m_allowedPenetration = m_allowedPenetration;
	if (convexCaster.calcTimeOfImpact(m_convexShapeFrom,m_convexShapeTo,m_triangleToWorld, m_triangleToWorld, castResult))
	{
		//add hit
		if (castResult.m_normal.length2() > btScalar(0.0001))
		{					
			if (castResult.m_fraction < m_hitFraction)
			{
/* btContinuousConvexCast's normal is already in world space */
/*
#ifdef USE_SUBSIMPLEX_CONVEX_CAST
				//rotate normal into worldspace
				castResult.m_normal = m_convexShapeFrom.getBasis() * castResult.m_normal;
#endif //USE_SUBSIMPLEX_CONVEX_CAST
*/
				castResult.m_normal.normalize();

				reportHit (castResult.m_normal,
							castResult.m_hitPoint,
							castResult.m_fraction,
							partId,
							triangleIndex);
			}
		}
	}
}
Beispiel #2
0
		virtual void processTriangle(btVector3* triangleVerts, int partId, int triangleIndex)
		{
			if (!m_oncePerSphere)
			{
				btTransform tr;
				tr.setIdentity();
				tr.setOrigin(m_curSpherePos);

				btTriangleShape triangleShape(triangleVerts[0],triangleVerts[1],triangleVerts[2]);
				SphereTriangleDetector detector(m_sphereChildShape,&triangleShape,0.);
				btVector3 hitPos,hitNormal;
				btScalar hitDepth,timeOfImpact;
				if (detector.collide(m_curSpherePos,hitPos,hitNormal,hitDepth,timeOfImpact,0.))
				{
					m_oncePerSphere = true;
					m_bunnyCompound->addChildShape(tr,m_sphereChildShape);
				}
			}
		}
Void ConcaveSphereCollision::CollisionQuery::ProcessTransformed( const ShapeConcave::TriangleLeaf & triLeaf )
{
    // Build triangle shape
    ShapeTriangle triangleShape( triLeaf.vTriangle );
    TransformedShapeConvex triangleTrShape( &triangleShape, Transform3::Identity );

    // Set transformed shapes
    TransformedShapeConvex *pTrShapeA, *pTrShapeB;
    if ( pThis->m_bReverseNormal ) {
        pTrShapeA = pThis->m_pSphere;
        pTrShapeB = &triangleTrShape;
    } else {
        pTrShapeA = &triangleTrShape;
        pTrShapeB = pThis->m_pSphere;
    }

    // Compute collision
    TriangleSphereCollision hCollision( pTrShapeA, pTrShapeB );
    hCollision.Initialize();
    if ( hCollision.DetectCollision( bGenerateContactPoints ) )
        bCollisionFound = true;

    // Build contact manifold
    if ( bGenerateContactPoints ) {
        ContactPointID curCPID;
        curCPID.dwSpecifierA = triLeaf.dwTriangleID;
        curCPID.dwSpecifierB = 0;
        curCPID.dwFeatureA = 0;
        curCPID.dwFeatureB = 0;
        if ( pThis->m_bReverseNormal )
            curCPID.ReverseObjects();

        const ContactPoint * pCP = hCollision.GetManifold()->GetContactPoint(0);

        pThis->m_pCollisionManifold->AddPoint( curCPID, pCP->vWorldPointA, pCP->vWorldPointB, pCP->vWorldNormalBA, pCP->fDistance );
    }
}