hkpGroupFilter·Î Ãæµ¹ ¼³Á¤

hkpGroupFilter·Î Ãæµ¹ ·¹ÀÌ¾î »çÀÌ¿¡ Ãæµ¹ ÇÒÁö ¾ÊÇÒÁö ¿©ºÎ¸¦ °áÁ¤ ÇÒ ¼ö ÀÖ´Ù.
'2'Å°¸¦ ´©¸£¸é º®°ú °øÀÌ Ãæµ¹ÇÏÁö ¾Ê°í °øÀÌ Åë°ú ÇÒ °ÍÀÌ´Ù.
'3'Å°¸¦ ´©¸£¸é º®°ú °øÀÌ Ãæµ¹ÇØ °øÀÌ º®¿¡ ƨ°Ü¼­ ³ª¿Ã °ÍÀÌ´Ù.

hkpGroupFilter¸¦ »ç¿ëÇÒ·Á¸é ¸ÕÀú hkpRigidBodyÀÇ ·¹À̾ ¼³Á¤ÇÑ´Ù.
·¹À̾î´Â Áߺ¹µÇÁö ¾Ê´Â À¯ÀÏÇÑ enumÀ¸·Î ¼±¾ðÇÑ´Ù.

enum

{

    KEYFRAME_LAYER = 1,    //¿¤¸®º£ÀÌƮó·³ ¿òÁ÷ÀÌ´Â rigid body

    BACKGROUND_LAYER = 2,  //ground rigid body

    STATIC_LAYER = 3,      //º® rigid body

    SPHERE_LAYER = 4,      //±¸ rigid body

};

 

< hkpRigidBody »ý¼º½Ã ·¹ÀÌ¾î ¼³Á¤ >

hkpRigidBodyCinfo¸¦ ÀÌ¿ëÇØ ·¹À̾ ¼³Á¤ÇÑ´Ù.

    hkpRigidBodyCinfo rigidBodyInfo;

    ...........

    rigidBodyInfo.m_collisionFilterInfo =

        hkpGroupFilter::calcFilterInfo( hkpGroupFilter::calcFilterInfo( STATIC_LAYER, 0) );

    ...........

    hkpRigidBody* pRigidBody = new  hkpRigidBody( rigidBodyInfo );

< ·¹À̾ÀÇ Ãæµ¹ ¿©ºÎ ¼³Á¤ >

hkpGroupFilter·Î ·¹À̾ÀÇ Ãæµ¹ ¿©ºÎ¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.
¼³Á¤ÇÏÁö ¾ÊÀ¸¸é ¸ðµç rigid body°£¿¡ Ãæµ¹ ÇÏ°Ô µÈ´Ù.

hkpGroupFilter::enableCollisionsBetween(  ) : ·¹À̾¿¡ Ãæµ¹ Çϵµ·Ï ¼³Á¤

hkpGroupFilter::disableCollisionsBetween( ) : ·¹À̾¿¡ Ãæµ¹ ÇÏÁö ¾Êµµ·Ï ¼³Á¤

flag°¡ trueÀÌ¸é µÎ °³ÀÇ º®°ú °øÀÌ Ãæµ¹Çϸç, falseÀ̸é Ãæµ¹ ÇÏÁö ¾Ê´Â´Ù.
óÀ½ hkpGroupFilter¸¦ ¸¸µé¶§ hkpWorld::SetCollisionFilter( ) ÇϱâÀü¿¡ ·¹ÀÌ¾î ¼³Á¤À» ÇÏÁö ¾ÊÀ¸¸é ¿¡·¯°¡ ³­´Ù.

void  SetEnableCollisionStaticBox( bool  bFlag )

{

    // Replace filter

    g_hkWorld->markForWrite();

    hkpGroupFilter* groupFilter = NULL;

 

    if( g_groupFilter == NULL )

    {

        g_groupFilter = new  hkpGroupFilter();

        groupFilter = g_groupFilter;

        if( bFlag == true )

            groupFilter->enableCollisionsBetween( STATIC_LAYER, SPHERE_LAYER );

        else

            groupFilter->disableCollisionsBetween( STATIC_LAYER, SPHERE_LAYER );

        g_hkWorld->setCollisionFilter( groupFilter, true);

        groupFilter->removeReference();

    }

    else

    {

        groupFilter = g_groupFilter;

        if( bFlag == true )

            groupFilter->enableCollisionsBetween( STATIC_LAYER, SPHERE_LAYER );

        else

            groupFilter->disableCollisionsBetween( STATIC_LAYER, SPHERE_LAYER );   

    }

    g_hkWorld->unmarkForWrite();   

}

 

< hkpGroupFilter ±¸Çϱâ >

getCollisionFilter()·Î ±¸ÇÒ ¼ö ÀÖ´Â°Ç hkpGroupFilter¸¸ ÀÖ´Â °ÍÀÌ ¾Æ´Ï±â ¶§¹®¿¡ m_typeÀ¸·Î
hkpCollisionFilter::HK_FILTER_GROUP·Î ±×·ì ÇÊÅÍÀÎÁö °Ë»çÇÑ´Ù.

hkpGroupFilter* GetGroupFilter( hkpWorld* pWorld )

{

    HK_ASSERT(0x526edf5d, pWorld->getCollisionFilter()

        && pWorld->getCollisionFilter()->m_type == hkpCollisionFilter::HK_FILTER_GROUP);

 

    hkpGroupFilter* groupFilter =

        static_cast<hkpGroupFilter*>(const_cast<hkpCollisionFilter*>(pWorld->getCollisionFilter()));

    return groupFilter;

}

 

ÇÁ·ÎÁ§Æ® : havok_hkpGroupFilter.zip