hkpRigidBody hkContactPoint

hkpRigidBody°¡ Ãæµ¹½ÃÀÇ hkContactPoint¸¦ ±¸ÇØ º¸ÀÚ. hkpContactListener¿Í hkpEntityListener¸¦ »ó¼ÓÇÑ HavokContactLister·Î´Â hkContactPoint¸¦ ±¸ÇÏ´Â ¹æ¹ýÀ» ãÀ»¼ö°¡ ¾ø¾ú´Ù.

±×·¡¼­ g_world->stepDeltaTime( ) ÀÌÈÄÀÇ hkpRigidBody::getLinkedCollidable( )·Î hkContactPoint¸¦ ±¸ÇÏ¸é µÈ´Ù.

void  CheckContactPoint( hkpRigidBody* pRigidBody )

{

    hkStepInfo stepInfo;

    hkReal fTimestep = 1.0f / 60.0f;

    stepInfo.m_deltaTime = fTimestep;

    stepInfo.m_invDeltaTime = 1.0f / fTimestep;

 

    hkpLinkedCollidable* coll = pRigidBody->getLinkedCollidable();

    hkArray< struct  hkpLinkedCollidable::CollisionEntry > collisionEntriesTmp;

    coll->getCollisionEntriesSorted(collisionEntriesTmp);

    hkVector4 vel = pRigidBody->getLinearVelocity();

    hkVector4 angVel = pRigidBody->getAngularVelocity();

    const   hkArray< struct hkpLinkedCollidable::CollisionEntry >& collisionEntries = collisionEntriesTmp;

 

    static  int  nLine = 0;

    for ( int i = 0; i < collisionEntries.getSize(); ++i )

    {

        hkpRigidBody* rb = hkpGetRigidBody( collisionEntries[i].m_partner );

        if ( rb != HK_NULL )

        {

            //if ( collisionEntries[i].m_agentEntry->m_contactMgr->m_type == hkpContactMgr::TYPE_SIMPLE_CONSTRAINT_CONTACT_MGR )

            {

                hkpSimpleConstraintContactMgr* mgr = (hkpSimpleConstraintContactMgr*)(collisionEntries[i].m_agentEntry->m_contactMgr);

                if( mgr->m_contactConstraintData.getNumContactPoints() > 0 )

                {

                    hkContactPoint* contactPoints = mgr->m_contactConstraintData.m_atom->getContactPoints();

 

                    for( int  n = 0; n < mgr->m_contactConstraintData.getNumContactPoints(); ++n )

                    {

                        hkVector4 pos = contactPoints[n].getPosition();

                        hkVector4 nor = contactPoints[n].getNormal();

                        if( FloatEqual(vel(0), 0) && FloatEqual(vel(1), 0) && FloatEqual(vel(2), 0 )

                            && FloatEqual(angVel(0), 0) && FloatEqual(angVel(1), 0) && FloatEqual(angVel(2), 0) )

                            OutputDebugPrintf( "¸ØÃá »óÅ %f, %f, %f \n", vel(0), vel(1), vel(2) );

                        else

                            OutputDebugPrintf( "%d ¼Óµµ %f, %f, %f Ãæµ¹ Æ÷ÀÎÅÍ %.2f, %.2f, %.2f\n",

                                nLine, vel(0), vel(1), vel(2),

                                nor(0), nor(1), nor(2) );

                        ++nLine;

                    }

                }

            }

        }

    }

}

hkContactPoint* contactPoints·Î Ãæµ¹ Æ÷ÀÎÅ͸¦ ±¸ÇÑ´Ù.

¹Ú½º°¡ ¹Ù´Ú¿¡¼­ ¸ØÃá »óŸ¦ ±¸Çϱâ À§Çؼ­ getLinearVelocity( ), getAngularVelocity( )ÀÇ °ªÀÌ FloatEqual( )·Î 1e-2fº¸´Ù ÀÛÀ» ¶§ ¸ØÃá°É·Î ÆÇ´ÜÇÑ´Ù. ÀÌ°Ç Á¤È®ÇÏÁö ¾ÊÀº °Í °°´Ù.
³ªÁß¿¡ ¹æ¹ýÀ» ãÀ¸¸é ÀÌÀåÀÇ Æ©Å丮¾óÀ» ¼öÁ¤ ÇÒ  °ÍÀÌ´Ù.

#define FLOAT_EPSILON    1e-2f   

inline    float ABS(float a)        { return (a < 0 ? -a : a); }

 

bool FloatEqual( float a, float b )

{

    float k = FLOAT_EPSILON;

    return fabs( a - b ) < FLOAT_EPSILON;

}

ÇÁ·ÎÁ§Æ®:
havok_contactPoint.zip
havok_config.cpp