hkpSphereShape hkContactPoint

아래 이미지는 벽을 공을 튕겨주는 이미지다.

실행 방법을 설명 하자면 1을 누르면 공이 바닥에 충돌 할떄 멈춘다. 다시 1을 누르면 공이 바닥에 충돌시 멈추기 않고 계속 굴러간다.
"Enter" 키를 누르면 공이 초기 위치에서 다시 발사한다. 속도도 빨라서 포물선을 그리면서 날라가는 것이 아니라 거의 직선에 가깝게 날라간다.

하복식으로 설명하자면 hkpSphereShape로 충돌 메쉬를 만들어 공이 날라가는 중에 충돌할 때  hkContactPoint를 구한다. 벽이 아니라 바닥과 충돌하는지 체크한다.
hkpSphereShap 타입의 hkpRigidBody는 AddDynamicShere( )에서 만든다.

발사체가 탄환 비슷한거라 hkpRigidBodyCinfo::m_qualityType을 HK_COLLIDABLE_QUALITY_BULLET로 설정하면 배경 메쉬와 충돌시 CheckContactPoint( )에서 hkContactPoint를  구할 수 없다.

이유는 알수 없다. 그래서 hkContactPoint를 바로 구하기 위해 디폴트 qualityType을 사용한다.

    //info.m_qualityType = HK_COLLIDABLE_QUALITY_BULLET;

< 공 멈추기 >

UpdateHavok( ) 함수 에서 공이 바닥과 충돌 하면 공을 멈추자.
Y-UP 좌표라 IsCheckWall(  )시에 바닥과 충돌 하는지 체크하기 위해 (0, -1, 0 ) 벡터와 일치 하면 공을 멈춘다.

void  UpdateHavok( hkVector4& pos, hkVector4& t )

{

    g_hkWorld->stepDeltaTime(1.0f/60.0f);

 

    if( g_sphereBody )

    {

        CheckContactPoint( g_sphereBody, g_wallPoint );

 

        //hkVector4 vel = g_sphereBody->getLinearVelocity();

        hkVector4 dir = hkVector4( 0, -1, 0 );

        if( IsCheckWall( dir, g_wallPoint ) )

        {

            OutputDebugPrintf( "공 멈추기\" );

            if( g_bStopBall )

                StopBall( g_hkWorld );

        }

 

    }

}

공을 멈추기 위해 hkpRigidBody의 속도( LinearVelocity ), 질량( Mass )를 0으로 만든다.
잘 될까???  안된다.. Mass를 0으로 셋팅 하면 이러면 안된다고 Assert( )를 토해 낸다.
0이 아니면 Assert가 안떠는데 0만 넣으면 Assert가 뜬다.

남은건 MotionType밖에 없다.

MotionType을 hkpMotion::MOTION_FIXED으로 설정 하니 공이 바닥에 충돌할 때 바로 멈춘다.
공이 바닥에 3번 정도 튕기고 나서 멈출려면, 하복 물리 이외의 별도의 로직 알고리즘 추가 해야 할 것이다.

void  StopBall( hkpWorld* pWorld )

{

    pWorld->lock();

 

    g_sphereBody->setLinearVelocity( hkVector4( 0, 0 ,0 ) );

    g_sphereBody->setMotionType( hkpMotion::MOTION_FIXED );

    //실행중에 Mass 값을 0으로 하면 죽는다.. 다른값은 이상없음

    //g_sphereBody->setMass( 0.0f );

 

    pWorld->unlock();

}

< hkArray 에러없이 해제하기 >

hkArray로 생성한 데이터는 std::vector처럼 clear( ) 메소드로 헤제하면 다음의 Assert 대화 상자가 뜰것이다.

Debug Error!
R6025
    - pure virtual function call

hkArray의 최종적으로 해제시에는 clearAndDeallocate( )로 해제해야 문제가 없다.
프로그램 중간에는 clear( )로 해제한다.

프로젝트:
havok_stopBall.zip
havok_config.cpp