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

ÇϺ¹¿¡¼­ ij¸¯Å͸¦ Á¦¾î ÇÏ´Â hkpCharacterRigidBody¿Í hkpCharacterProxy 2°¡Áö ¹æ¹ýÀÌ ÀÖ´Ù.

ÀÌµé ¹æ¹ýÀÇ Àå´ÜÁ¡À» ¾Ë¾Æº¸°í ÀÚ¼¼ÇÑ »ç¿ë¹ý¿¡ ´ëÇؼ­ ¼³¸íÇÑ´Ù.

< hkpCharacterRigidBody >

ij¸¯Å͸¦ Á¦¾îÇϱâ À§ÇÑ »õ·Î¿î ¹æ¹ýÀÌ´Ù. ½Ã¹Ä·¹À̼ǽà ´õ ³ôÀº ÆÛÆ÷¸Õ½º¿Í ¼Õ½Ç¾ø´Â ½Ã¹Ä·¹ÀÌ¼Ç Ä÷¸®Æ¼¸¦ Á¦°øÇÑ´Ù.

ÀåÁ¡:

1. hkRidgidBody¿Í °°ÀÌ ¿ùµå¸¦ ½Ã¹Ä·¹ÀÌ¼Ç ÇÒ¶§, ¹°¸®ÀûÀ¸·Î ¿òÁ÷ÀδÙ. ¸ÖƼ¾²·¹µå¿¡µµ È¿°úÀûÀÌ´Ù.±×·¡¼­, hkhkpCharacterRigidBody´Â hkpCharacterProxy º¸´Ù ´õ ÁÁÀº ÆÛÆ÷¸Õ½º¸¦ Á¦°øÇÑ´Ù.( °³ÀÎÀûÀ¸·Î Å×½ºÆ® ÇÒ¶§, 10¹è ÀÌ»óÀÇ ÇÁ·¹ÀÓ Â÷ÀÌ°¡ ÀÖ¾ú´Ù. )

2. hkhkpCharacterRigidBody´Â ¿ùµå ½Ã¹Ä·¹À̼ÇÀ» ÇÒ¶§, µ¿½Ã¿¡ Ãæµ¹ ½Ã¹Ä·¹À̼ÇÀ» Çϸé, Á¤È®ÇÏ°Ô Ãæµ¹À» Á¦¾îÇÑ´Ù.

3. ij¸¯ÅÍ Ãæµ¹Àº Ç¥ÁØ  hkpContactListener ÀÎÅÍÆäÀ̽º¸¦ ÄݹéÇÑ´Ù.   hkRidgidBody³ª  ¿ùµåó·³ Àû¿ëµÈ´Ù.

 

´ÜÁ¡:

1. hkhkpCharacterRigidBody´Â ¹°¸® ½Ã¹Ä·¹ÀÌ¼Ç ¾÷µ¥ÀÌÆ® Áֱ⿡ ¸ÂÃç¼­ ¾÷µ¥ÀÌÆ®°¡ ÇÊ¿äÇÏ´Ù. ÇÏÁö¸¸ ½ÇÁ¦ °ÔÀÓ¿¡¼­´Â ·ÎÁ÷, ³×Æ®¿÷, Ai, ¾Ö´Ï¸ÞÀ̼ǰú µ¿±âÈ­ µÇ¼­ ¾÷µ¥ÀÌÆ®°¡ ÇÊ¿äÇÏ´Ù. ÇÊ¿ä ÇÒ ¶§ ¾÷µ¥ÀÌÆ® µÇ´Â °ÍÀÌ ¾Æ´Ï¶ó ·çÇÁ¿¡¼­ ÁÖ±âÀûÀ¸·Î ¾÷µ¥ÀÌÆ® µÇ±â ¶§¹®¿¡ ·ÎÁ÷°ú µ¿±âÈ­ ½ÃÅ°´Â °ÍÀÌ Èûµé´Ù.

< hkpCharacterProxy >

ÀåÁ¡:

1. ¸ðµç Ç÷§Æû¿¡¼­ ¿À·§µ¿¾È »ç¿ëµÇ¾î¿Â ½Ã½ºÅÛÀÌ´Ù.

2. ÁÖ±âÀûÀÎ ¿ùµå ¾÷µ¥ÀÌÆ®¿Í´Â »ó°ü¾øÀÌ ·ÎÁ÷, Ç÷¹À̾îÀÇ ÀÔ·Â, AI¿¡ µû¶ó Á÷Á¢ À§Ä¡³ª ¼Óµµ¸¦ ¾òÀ»¼ö ÀÖ´Ù.

 

´ÜÁ¡:

1. ¸ÖƼ¾²·¹µå¸¦ ÀÌ¿ëÇϱâ Èûµé¸ç,  hkpCharacterRigidBodyº¸´Ù ÆÛÆ÷¸Õ½º°¡ ´À¸®´Ù.

 

Âü°í·Î Áö±¸ÀÇ Áß·ÂÀº 9.8kgÀÌ´Ù.  hkpWorldCinfo¿¡ °ªÀ» ´ëÀÔÇÒ ¶§ -9.5KgÀÌ´Ù.

hkpCharacterRigidBodyÀÇ ÃÖ´ë ¼Óµµ Á¦ÇÑÀ» Ç®±â À§Çؼ­´Â ¾Æ·¡ ¼¼°¡Áö¸¦ ¼ÂÆÃÇÑ´Ù.

1) ÁöÇü»óÅ¿¡¼­ ¼Óµµ ¼³Á¤
hkpCharacterState *state = new hkpCharacterStateOnGround();
static_cast<hkpCharacterStateOnGround*>(state)->setSpeed(30);

2) hkpCharacterRigidBodyCinfoÀÇ m_maxLinearVelocity °ª ¼³Á¤
characterRigidBodyCInfo.m_maxLinearVelocity = 1000

3) characterContextÀÇ ¼Óµµ ¼³Á¤
m_characterContext->setFilterParameters( 0.9f, 1000, 1000.0f );

hkpCharacterRigidBody¿Í hkpCharacterProxy¿¡¼­ ¶¥¿¡ ´ê¾Ò´ÂÁö È®ÀÎÇÏ´Â ¹æ¹ýÀº ´ÙÀ½°ú °°´Ù.
hkpCharacterProxy¿¡¼­ Ãæµ¹Çß´ÂÁö È®ÀÎÇÏ´Â ¹æ¹ýÀº ¿øÇÏ´Â º¤ÅÍ°ªÀ» °ªÀ» ÁÙ¼ö Àֱ⠶§¹®¿¡ °ÔÀÓ·ÎÁ÷¿¡¼­ ´õ Æí¸®ÇÒ °Í °°´Ù. ÀÌ°Ç ³ªµµ Å×½ºÆ® ÇÏÁö ¾Ê¾Ò´Ù.

< hkpCharacterRigidBody¿¡¼­ ¶¥¿¡ ´ê¾Ò´ÂÁö È®ÀÎÇÏ´Â ¹æ¹ý >

bool  HavokCharacter::IsSupported()

{

    hkReal timestep = 1.f / 60.f;

    // Check support

    hkpSurfaceInfo ground;

 

    hkStepInfo stepInfo;

    stepInfo.m_deltaTime = timestep;

    stepInfo.m_invDeltaTime = 1.f / timestep;

 

    hkpCharacterRigidBody* pCharRigidBody = m_pHavokRigidBody;

    //pCharRigidBody->getRigidBody()->markForRead();

    pCharRigidBody->checkSupport(stepInfo, ground);

    //pCharRigidBody->getRigidBody()->unmarkForRead();

 

    bool bRes = ( ground.m_supportedState != hkpSurfaceInfo::UNSUPPORTED );

    return bRes;

}

hkpCharacterRigidBody::checkSupport( )ÀÇ µÎ ¹ø° ÀÎÀÚ hkpSurfaceInfo·Î ÀÌÀü ´Ü°èÀÇ »óŸ¦ ¾ò¾î¿Â´Ù.
hkpSurfaceInfo::m_supportedState´Â 3°¡Áö »óŸ¦ ¾Ë·ÁÁØ´Ù.

UNSUPPORTED °øÁß¿¡ ÀÖ´Â »óÅ 
SLIDING ½½¶óÀ̵ù »óÅÂ
SUPPORTED ¶¥¿¡ ÀÖ´Â »óÅÂ

hkpSurfaceInfo´Â ÀÌ¿Ü¿¡µµ ÁöÇ¥¸éÀÇ ³ë¸Ö°ª, ÁöÇ¥¸éÀÇ Æò±Õ¼Óµµ ( m_surfaceNormal , m_surfaceVelocity )ÀÇ Á¤º¸µµ ¾Ë¼ö ÀÖ´Ù.

< hkpCharacterProxy¿¡¼­ ¶¥¿¡ ´ê¾Ò´ÂÁö È®ÀÎÇÏ´Â ¹æ¹ý >

bool  HavokActor::IsSupported()

{

    hkpSurfaceInfo ground;

    const  hkVector4 down(0.0f, 0.0f, -1.0f);

 

    m_characterProxy->checkSupport( down, ground );

    bool  bRes = ( ground.m_supportedState != hkpSurfaceInfo::UNSUPPORTED );

    return  bRes;

}

< ij¸¯Å͸¦ Á¦¾î ÇÏ´Â ¹æ¹ý >

¾ÕÀå¿¡¼­ À߸øÇÑ °ÍÀº setLinearAccelerationToMassModifier( )´Â m_characterContext->update( xInput, output ) ÀÌÈÄ¿¡ ½ÇÇàÇÑ´Ù.

¿ùµå ÁÂÇ¥°è°¡ Z-UPÀ϶§ forward´Â m_forward.set( 0.0f, -1.0f, 0.0f )¿Í °°ÀÌ ¼ÂÆÃÇÑ´Ù.
fowardÀÇ y °ªÀ» -1·Î ¼ÂÆÃÇØ¾ß ¸ð´ÏÅÍÀÇ ¾ÈÂÊÀ¸·Î y°ªÀÌ Áõ°¡Çϸç, ¿À¸¥ÂÊÀ¸·Î °¥¼ö·Ï x°ªÀÌ Áõ°¡ÇÑ´Ù.

    float down = 0;

    if( IsSupported() == false )

        down = -5;

    output.m_velocity = hkVector4( fDX, fDZ, down );

    m_pHavokRigidBody->setLinearVelocity( output.m_velocity, fTimestep );

IsSupported( )´Â ÇöÀç À§Ä¡°¡ ¶¥¿¡ ÀÖ´ÂÁö üũÇÏ´Â °ÍÀÌ´Ù. IsSupported( )°¡ trueÀ̸é ÇöÀç À§Ä¡¿¡ ¹Ù´Ú¿¡ ÀÖ°í, falseÀÌ¸é °øÁß¿¡ ÀÖ´Â »óÅÂÀ̹ǷΠZÃà ¼Óµµ¸¦ -5·Î ¼ÂÆÃÇÑ´Ù.

< hkpCharacterRigidBody¿¡¼­ ÃÖ´ë ¼Óµµ ¼³Á¤ >

hkpCharacterRigidBody::setLinearVelocity( )¿¡¼­ ¼Óµµ¸¦ ¿Ã·Áµµ ¿øÇÏ´Â ¼Óµµ°¡ ³ª¿ÀÁö ¾Ê´Â´Ù¸é ´ÙÀ½ÀÇ 2°¡Áö¸¦ üũÇ϶ó.( m_maxLinearVelocity, setFilterParameters( ) )

    hkpCharacterRigidBodyCinfo characterRigidBodyCInfo;

    characterRigidBodyCInfo.m_maxLinearVelocity = 1000;

 

    hkpCharacterContext*    m_characterContext;

    m_characterContext->setFilterParameters(0.9f, 400, 400.0f);

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

¸®¼Ò½º : MyTest.zip