hkpKeyFrameUtility::applyHardKeyFrame로 속도 설정

이전 장에서 출발지 목적지로 움직이는 애니메이션이 있을 때, 움직이는 거리를 속도 계산을 직접 하엿다.

하복에서는 KeyFrame에 사용하기 위한 유틸리티 함수가 제공 된다.

hkpKeyFrameUtility::applyHardKeyFrame( )를 이용하면 번거로운 식없이 hkpRigidBody의 속도를 설정 할 수 있다.

void  NewMoveKeyFrameBox()

{

    static  float  height = 0;

    static   bool  bPlus = true;

    float    step = 0.25f;   

 

    hkVector4 newPos;

    newPos = g_keyFrameRigidBox->getPosition();

 

    if( height >= 5 )

        bPlus = false;

    if( height <= -5 )

        bPlus = true;

 

    if( bPlus )

        height += step;

    else

        height -= step;

 

    newPos(1) = height;

 

    //hkpKeyFrameUtility::applyHardKeyFrame( )를 이용해 rigidBody 속도 설정

    hkQuaternion rotation;

    rotation.setIdentity();

    hkVector4 nextPos = newPos;

    hkpKeyFrameUtility::applyHardKeyFrame( nextPos, g_keyFrameRigidBox->getRotation(), 60.0f, g_keyFrameRigidBox );

}

hkpKeyFrameUtility::applyHardKeyFrame(  )에서 첫 번째 인자는 다음 목적지의 위치, 두 번째 인자는 다음 목적지의 회전값이다. 셋번째 인자는 델타 타임의 역수이다. 네 번째 인자는 이동할 hkpRigidBody이다.

< hkpRigidBody 사라지는 현상 >

hkpRigidBody가 제대로 익스포트 되었는데도 불구하고 비쥬얼 디버거로 보면 월드가 추가 되지 않는 경우가 있다.

비쥬얼 디버거로 안보이는 경우는 hkpWorld 월드 생성시 hkpWorldCinfo 맴버의 m_broadPhaseBorderBehaviour의 값이 BROADPHASE_BORDER_REMOVE_ENTITY 값으로 설정 되어 있는지 확인한다. 현재위치와 많이 떨어져 있는 경우, setBroadPhaseWorldSize(  )를 벗어 나거나 중심점과 많이 떨어져 있으면 자동으로 하복 엔터티를 제거 해 버린다.

그래서 월드 생성시 다음과 같이 한다.

hkpWorldCinfo info;
info.m_broadPhaseBorderBehaviour = info.BROADPHASE_BORDER_DO_NOTHING;

< hkpRigidBody가 움직이지 않는 경우 >

이 경우는 다양하지만, 여기서 예를 드는것도 하나의 예일 것이다.
hkpWorldCinfo의 setBroadPhaseWorldSize( )에서 설정한 월드 크기의 범위를 넘어가는 경우, rigidBody가 움직이지 않으면서 속도를 설정 할 수 없다는 워닝이 뜰 것이다.

hkpWorldCinfo info;
info.setBroadPhaseWorldSize( 10000.0f );

여기서는 테스트이기 때문에 10000이라는 큰 범위를 주고 있다.

프로젝트 : havok_hkpKeyFrameUtility.zip