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
|