HavokDemo¿¡¼­ ij¸¯ÅÍ Á¦¾î2

< ij¸¯ÅÍÀÇ Ãæµ¹ ¸Þ½¬ À§Ä¡¿Í ·»´õ¸µ ij¸¯ÅÍÀÇ À§Ä¡ ÀÏÄ¡ ½ÃÅ°±â >

ij¸¯ÅÍÀÇ Ãæµ¹ ¸Þ½¬´Â ¾Æ·¡¿Í °°Àº ÄÚµå·Î ¸¸µç´Ù. ½ÇÇàÇϸé ij¸¯ÅÍ´Â À§ ±×¸²Ã³·³ ĸ½¶ÀÇ Á᫐ ³ôÀÌ À§Ä¡¿¡ ij¸¯ÅÍ°¡ µÕµÕ ¶° ÀÖÀ» °ÍÀÌ´Ù.
Ãæµ¹ ¸Þ½¬´Â ĸ½¶ÀÇ Áß°£ ³ôÀÌ°¡ Áß½ÉÀÌÁö¸¸ ·»´õ¸µ µÇ´Â ij¸¯ÅÍÀÇ Á᫐ À§Ä¡´Â 0ÀÌ´Ù.

    hkVector4 va( 0.0f, 0.0f, CHARACTER_SCALE_RATIO * 0.2f );

    hkVector4 vb( 0.0f, 0.0f, CHARACTER_SCALE_RATIO * -0.2f );

    m_pStandShape = new  hkpCapsuleShape( va, vb, CHARACTER_SCALE_RATIO * 0.497f );       

 

    va.setZero4();

    m_pCrouchShape = new  hkpCapsuleShape( va, vb, CHARACTER_SCALE_RATIO * 0.497f );

ĸ½¶ÀÇ Á᫐ ³ôÀ̸¦ 0À¸·Î ¸ÂÃß±â À§Çؼ­´Â ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.

lerp °ªÀ» Àß Á¶Á¤Çϸé ij¸¯ÅÍÀÇ Ãæµ¹ ¸Þ½¬ Áß½ÉÁ¡°ú ·»´õ¸µ µÇ´Â ij¸¯ÅÍÀÇ Áß½ÉÁ¡ÀÌ ÀÏÄ¡ µÉ °ÍÀÌ´Ù.

    const hkReal totalHeight = CHARACTER_SCALE_RATIO;

    const hkReal radius = CHARACTER_SCALE_RATIO * 0.45f;

 

    float lerp = 4.5f;

    hkVector4 va(0, 0, totalHeight + lerp );

    hkVector4 vb(0, 0, 0 + lerp );

 

    m_pStandShape = new hkpCapsuleShape( va, vb, radius );       

    va.setZero4();

    m_pCrouchShape = new hkpCapsuleShape( va, vb, radius );

Ãæµ¹ ¸Þ½¬ Áß½ÉÁ¡°ú ·»´õ¸µ µÇ´Â ij¸¯ÅÍÀÇ Áß½ÉÁ¡ÀÌ ÀÏÄ¡ ÇÏ´ÂÁö È®ÀÎ Çϱâ À§Çؼ­ ´ÙÀ½À» ½ÇÇàÇÑ´Ù.

    hkpCharacterInput   xInput;

    m_pHavokRigidBody->checkSupport( stepInfo, xInput.m_surfaceInfo );

 

    hkVector4 charPos = m_pHavokRigidBody->getPosition();

    hkVector4 pos = xInput.m_position;

    hkVector4 normal = xInput.m_surfaceInfo.m_surfaceNormal;

    OutputDebugPrintf( "ij¸¯ÅÍ ³ôÀÌ %.2f: À§Ä¡: %.2f, %.2f, %.2f Ç¥¸é ³ë¸Ö %f, %f, %f\n",

        charPos(2), pos(0), pos(1), pos(2),

        normal(0), normal(1), normal(2) );

Ãâ·Â µÇ´Â ij¸¯ÅÍÀÇ ³ôÀÌ(zÃà) charPos(2)¿Í ÁöÇü°ú Ãæµ¹µÈ Ãæµ¹ Á¤Á¡ÀÇ °ªÀ» ÀÏÄ¡ ½ÃŲ´Ù.

ij¸¯ÅÍ ³ôÀÌ 0.05: À§Ä¡: 0.00, 0.00, 0.05 Ç¥¸é ³ë¸Ö 0.000000, 0.000000, 1.000000

 

< º®°ú Ãæµ¹ ¸é ±¸Çϱâ >

1. hkpCharacterRigidBody::hkpRigidBody::getLinkedCollidable()¸¦ ÀÌ¿ëÇؼ­ hkpLinkedCollidable·Î
hkContactPoint ±¸ÇÏ´Â ¹æ½Ä

HavokCharacter::CheckContactPoint( ) ¸Þ¼Òµå¸¦ ÂüÁ¶ÇÑ´Ù.

m_pHavokRigidBody->getSupportInfo·Î ±¸ÇÑ ÁöÇü ³ôÀ̺¸´Ù Å« °æ¿ì¸¦ º®ÀÇ Ãæµ¹ÀÌ¶ó °¡Á¤ÇÑ´Ù.

HavokCharacter::IsCheckWall(  const hkVector4& velocity )·Î CheckContactPoint( )¿¡¼­ ±¸ÇÑ
ContactPoint Áß¿¡¼­ ÇöÀç ÁøÇà ¹æÇâÀÇ ¿ª¹æÇâ°úÀÇ °¢µµ Â÷ÀÌ·Î º®°ú Ãæµ¹ Çß´ÂÁö üũÇÑ´Ù.

2. hkContactPoint¸¦ ±¸ÇÏ´Â ¶Ç ÇÑ°¡ÁöÀÇ ¹æ¹ýÀº hkpCharacterRigidBodyListener¸¦ »ó¼ÓÇؼ­ °¡»óÇÔ¼ö
processActualPoints( )¸¦ »ç¿ëÇؼ­ hkContactPoint( )¸¦ ±¸ÇÏ´Â ¹æ½ÄÀÌ´Ù.

¿©±â¼­´Â hkpCharacterRigidBodyListener¸¦ »ó¼ÓÇÑ HavokCharacterListener Ŭ·¡½º¸¦ ¸®½º³Ê·Î ¼ÂÆÃÇÑ´Ù.

    HavokCharacterListener* pListener = new  HavokCharacterListener();

    m_pHavokRigidBody->setListener( pListener );

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

HavokCharacterListener.h
HavokCharacterListener.cpp

HavokCharacter.h
HavokCharacter.cpp