hkpTriggerVolume

hkpTriggerVolumeÀ» ÀÌ¿ëÇϸé hkpRigidBody¸¦ Æ®¸®°Å·Î »ç¿ë ÇÒ ¼ö ÀÖ´Ù.
±âº» µµÇüÀÎ ¹Ú½º¸¸ ¿ø¸ð¾çÀÇ µµÇüÀº ¹°·Ð, 3DSMAX¿¡¼­ ÀͽºÆ÷Æ®ÇÑ hkpRigidBody¸¦ Æ®¸®°Å·Î µî·Ï ÇÒ ¼ö ÀÖ´Ù.

ColliderÀÎ RigidBody°¡ Collidee hkpTriggerVolume¿¡ Ãæµ¹ µÇ¸é Æ®¸®°Å°¡ ¹ßµ¿µÈ´Ù. Æ÷ÇÔ°ü°è´Â Áö¿ø µÇ´ÂÁö ãÀ»¼ö ¾ø´Ù.

Æ®¸®°Å »ý¼º, Æ®¸®°Å Äݹé, hkpRigidBody¸¦ Æ®¸®°Å¿¡ µî·Ï, Æ®¸®°Å À̺¥Æ®  4°¡Áö·Î ³ª´²¼­ ¾Ë¾Æ º»´Ù.

< Æ®¸®°Å »ý¼º >

class  HavokTriggerVolume : public  hkpTriggerVolume

{

public:

    HavokTriggerVolume( hkpRigidBody* triggerBody, HavokTrigger* pTrigger );

 

    // Bring in the other callback we are not overriding

    using  hkpTriggerVolume::triggerEventCallback;

    virtual  void  triggerEventCallback( hkpRigidBody* body, EventType type );

 

private:

    HavokTrigger* m_pOwner;   

};

hkpTriggerVolumeÀ» »ó¼ÓÇÏ¿© Æ®¸®°Å¸¦ ¸¸µç´Ù.
HavokTrigger Ŭ·¡½º´Â hkpTriggerVolume¿¡ µî·ÏÇÏ´Â RigidBody¸¦ °ü¸®ÇÑ´Ù.
¸ÞÀÎ ·çÇÁ¿¡¼­ ½ÇÁ¦·Î Á¢±ÙÇϴ Ŭ·¡½º´Â HavokTrigger Ŭ·¡½ºÀÌ´Ù.
 

< Æ®¸®°Å Äݹé >

void  HavokTriggerVolume::triggerEventCallback( hkpRigidBody* body, EventType type )

{

    if ( type & ENTERED_EVENT )

    {

        if( body->hasProperty( HAVOK_UID_PROPERTY ) )

        {

            int  uid = 0;

            uid = body->getProperty( HAVOK_UID_PROPERTY ).getInt();

            std::vector<int>& idArr = m_pOwner->GetIDArray();

            idArr.push_back( uid );

            OutputDebugPrintf( "¹Ú½º Æ®¸®°Å ¹ßµ¿ ½ÃÀÛ: %d\n", uid );

        }

    }

    else  if ( type & LEFT_EVENT )

    {

        if( body->hasProperty( HAVOK_UID_PROPERTY ) )

        {

            int  uid = 0;

            uid = body->getProperty( HAVOK_UID_PROPERTY ).getInt();

            std::vector<int>& idArr = m_pOwner->GetIDArray();

            std::vector<int>::iterator iter = std::find( idArr.begin(), idArr.end(), uid );

            if( iter != idArr.end() )

            {

                idArr.erase( iter );

            }

            OutputDebugPrintf( "¹Ú½º Æ®¸®°Å ¹ßµ¿ Á¾·á: %d\n", uid );

        }

    }

}

EventTypeÀÌ ENTERED_EVENTÀ̸é Ãæµ¹ÀÌ ¹ß»ýÇßÀ» ¶§, LEFT_EVENT À̸é Ãæµ¹ÀÌ ³¡³µÀ» ¶§ ÄݹéÀÌ ºÒ¸®¿î´Ù.
Ãæµ¹½Ã HAVOK_UID_PROPERTYÀÇ ¼Ó¼ºÀ» º°µµ·Î ÀúÀåÇÏ¿© hkpRigidBodyÀÇ ID¸¦ ÀúÀåÇÑ´Ù.
HAVOK_UID_PROPERTY ¼Ó¼ºÀÇ ID·Î ¾î¶² RigidBody°¡ Ãæµ¹Çß´ÂÁö ¾Ë¼ö ÀÖ´Ù.

< hkpRigidBody¸¦ Æ®¸®°Å¿¡ µî·Ï >

bool  HavokTrigger::Create( hkpWorld* pWorld, int  id, const  TriggerBox& trBox )

{

    const  PhysicsDefine::Vector3&    pos = trBox.pos;

    const  PhysicsDefine::Vector3&    halfExtent = trBox.halfExtent;

 

    pWorld->lock();

 

    hkpShape* boxShape = hkpShapeGenerator::createConvexVerticesBox( hkVector4( halfExtent.x, halfExtent.y, halfExtent.z ) );

 

    hkpRigidBodyCinfo boxInfo;

    boxInfo.m_motionType = hkpMotion::MOTION_FIXED;

    boxInfo.m_shape = boxShape;

 

    boxInfo.m_position.set( pos.x, pos.y, pos.z );

 

    hkpRigidBody* box = new  hkpRigidBody( boxInfo );

    box->addProperty( HAVOK_UID_PROPERTY, id );

 

    pWorld->addEntity( box );

    boxShape->removeReference();

 

    ( new  HavokTriggerVolume( box, this ) )->removeReference();

 

    pWorld->unlock();

    m_world = pWorld;

    m_pRigidBody = box;

 

    if( HavokDebug::Instance() )

        HavokDebug::Instance()->MakeMesh( boxShape, m_pRigidBody, true );

 

    return  true;

}

hkpTriggerVolumeÀ» »ó¼ÓÇÑ Å¬·¡½º¿¡ hkpRigidBody¸¦ µî·ÏÇØ¾ß Ãæµ¹½Ã Æ®¸®°Å ÄݹéÀÌ ½ÇÇàµÈ´Ù.
 ( new  HavokTriggerVolume( box, this ) )->removeReference( )¿¡¼­ RigidBody¸¦ µî·ÏÇØÁÖ°í ÀÖ´Ù.

HavokDebug::Instance()->MakeMesh( boxShape, m_pRigidBody, true )´Â Æ®¸®°Å¸¦ ´«À¸·Î º¸¿©ÁÖ°í µð¹ö±ë Çϱâ À§ÇØ ·»´õ¸µ ÇÏ´Â ¸í·ÉÀÌ´Ù.

< Æ®¸®°Å À̺¥Æ® >

std::vector<int>& uidArr = g_boxTrigger->m_charIDArr;

std::vector<int>::iterator intIter = std::find( uidArr.begin(), uidArr.end(), SPHERE_ID );

 

char strDisplay[128];

if( intIter != uidArr.end() )   

    sprintf_s( strDisplay, 128, "'2'Å°:½ºÅÂƽ¹Ú½º °øÅë°ú, '3'Å°: ½ºÅÃƽ¹Ú½º Ãæµ¹    Sphere %d´Â Æ®¸®°Å¿Í Ãæµ¹", SPHERE_ID );

else

    sprintf_s( strDisplay, 128, "'2'Å°:½ºÅÂƽ¹Ú½º °øÅë°ú, '3'Å°: ½ºÅÃƽ¹Ú½º Ãæµ¹    Sphere %d´Â Æ®¸®°Å¿Í ¹ÌÃæµ¹", SPHERE_ID );

HavokTriggerÀÇ g_boxTrigger¸¦ ÅëÇÏ¿© Æ®¸®°Å°¡ ¹ßµ¿ µÇ¾ú´ÂÁö üũ ÇÑ´Ù.
m_charIDArr¿¡ Æ®¸®°Å¿Í Ãæµ¹ÇÑ RigidBodyÀÇ ID¸¦ ÀúÀåµÈ´Ù.
HavokTrigger´Â Æ®¸®°ÅÀÇ ¸Å´ÏÀú°¡ ¾Æ´Ï´Ù. ÇÑ °³ÀÇ RigidBody, ÇÑ °³ÀÇ hkpTriggerVolume¸¸ ó¸®ÇÑ´Ù.
¾Æ´Ï¸é RigidBody°¡ ¿©·¯°³ÀÌ´õ¶óµµ ÇϳªÀÇ RigidBodyó·³ ó¸®ÇÏ´Â °ÍÀº ¹®Á¦°¡ ¾ø´Ù.

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