HavokLevel

3D 툴( 3DSMAX, 마야등 )에서 익스포트한 하복 포맷의 *.hkx를 정적인 배경 데이터로 로딩해 보자.
데이터의 확인은 비쥬얼 디버거로만 확인 할 수 있다.

가장 큰 박스가 "ground.hkx" 파일이다.
왼쪽 두 개의 중간 크기 박스는 MakeStaticBox( )에 의해 만들어진 충돌 메쉬이다.

hkx 파일이나 하복으로 익스포트된 파일을 로딩하기 위해서는 hkLoader의 객체를 생성한다.
HavokManager에서 생성후 HavokLevel로 전달한다.

파일 로딩후 hkpWorld에 추가하는 방법은 addEntity( )로 추가 하는 방법과 addPhysicsSystem( )로 추가하는 방법이 있다. HavokLevel에서는 각각 AddWorld( ), AddPhysicsSystem( ) 메소드를 제공한다.

< hkpWorld::addEntity( ) >

hkpRigidBody* HavokLevel::AddWorld( const  char* fileName )

{

    hkLoader* loader = HavokManager::Instance()->GetLoader();

    hkRootLevelContainer* container = loader->load( fileName );

    if( !container )

    {

        throw  std::runtime_error("Can't load collision mesh ");

    }

 

    HK_ASSERT2(0xaefe9356, container != HK_NULL , "Could not load asset");

    hkpPhysicsData* physics = static_cast<hkpPhysicsData*>( container->findObjectByType( hkpPhysicsDataClass.getName() ) );

    HK_ASSERT2(0x245982ae, physics != HK_NULL, "Could not find physics data in root level object" );

 

    hkpRigidBody* pRigidBody = physics->getPhysicsSystems()[0]->getRigidBodies()[0];

    pRigidBody->setPosition(hkVector4(90,0,0));

 

    hkpWorld* pWorld = HavokManager::Instance()->GetWorld();

    pWorld->markForWrite();

    pWorld->addEntity(pRigidBody);

    pRigidBody->removeReference();

    pWorld->unmarkForWrite();

    return  pRigidBody;

}

hkLoader로 파일 로딩후 hkpWorld의 addEntity( )로 추가한다.

< hkpWorld::AddPhysicsSystem( ) >

hkpPhysicsData* HavokLevel::AddPhysicsSystem( const  char* fileName )

{

    hkLoader* loader = HavokManager::Instance()->GetLoader();

    hkRootLevelContainer* container = loader->load( fileName );

    if( !container )

    {

        throw  std::runtime_error("Can't load collision mesh ");

    }

 

    HK_ASSERT2(0xaefe9356, container != HK_NULL , "Could not load asset");

    hkpPhysicsData* physics = static_cast<hkpPhysicsData*>( container->findObjectByType( hkpPhysicsDataClass.getName() ) );

    HK_ASSERT2(0x245982ae, physics != HK_NULL, "Could not find physics data in root level object" );

 

    hkpWorld* pWorld = HavokManager::Instance()->GetWorld();

    pWorld->lock();

 

    // Add all the physics systems to the world

    for ( int  i = 0; i < physics->getPhysicsSystems().getSize(); ++i )

    {

        pWorld->addPhysicsSystem( physics->getPhysicsSystems()[i] );

    }

 

    pWorld->unlock();

    return  physics;

}

hkLoader로 파일 로딩후 hkpWorld의 AddPhysicsSystem( )로 추가한다.

프로젝트 : havok_level.zip