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