HavokDemo에 프로그램 추가하기2

하복데모에 HavokCharacter, HavokActor, HavokLevl을 추가하여 주전자위에 캡슐이 움직이는 것을 보여준다.

HavokLevlel은 주전자를 로딩한다.
HavokCharacter나 HavokActor는 캡슐을 움직인다.

HavokCharacter, HavokActor, HavokLevl 클래스의 기능은 앞에서 이야기 했기 때문에 HavokTest에서 중요한것만 이야기 하겟다.

< 카메라 제어 : HavokTest.cpp >

카메라는 from, to, up 행렬순이라 쉽게 이해 할것이다.

HavokTest::HavokTest(hkDemoEnvironment* env)

:    hkDefaultPhysicsDemo(env), m_up(0.0f, 0.0f, 1.0f)

{

    hkVector4 from( 0, -5, 70.0f );

    hkVector4 to  ( 0,0,0 );

    hkVector4 up  ( 0,0,1 );

    setupDefaultCameras( env, from, to, up );

    .......

}

< HavokDefine의 설정 : HavokDefine.h >

USE_HAVOKDEMO는 하복 데모용으로 돌릴지 결정한다.
USE_ZUP은 YUP으로 할지 ZUP으로 할지 결정한다.
CHARACTER_SCALE_RATIO는 캐릭터의 키를 나타낸다.
USE_HAVOK_CHARACTER는 캐릭터를 HavokCharacter나 HavokActor로 실행 할지 결정한다.

#define USE_HAVOKDEMO    1

#define  USE_ZUP          1

 

//렌더링 캐릭터와 키 높이

#define  CHARACTER_SCALE_RATIO  3

 

//캐릭터 컨트롤은 CharacterControlVsDemo.cpp 참조

#define  USE_HAVOK_CHARACTER   1

 

< 캐릭터의 최초 위치 >

캐릭터를 생성시 캐릭터의 위치를 정한다.

void  CreateActor()

{

#ifdef     USE_HAVOK_CHARACTER

    g_character = new  HavokCharacter;

    g_character->Create( hkVector4( 0, 0, 60 ) );

#else

    g_actor    = new  HavokActor;

    g_actor->CreateCapsuleProxy( hkVector4( 0, 0, 60 ) );

#endif

}

< 캐릭터 위치 설정 >

캐릭터의 위치를 설정한다.

void  HavokActor::SetPosition( float x, float y, float z )

{

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

    pWorld->lock();

    pWorld->markForWrite();

 

    hkVector4 pos( x, y, z );

    m_characterProxy->setPosition( pos );

 

    pWorld->unmarkForWrite();

    pWorld->unlock();

}

 

void  HavokCharacter::SetPosition( float  x, float  y, float  z )

{

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

    pWorld->lock();

    pWorld->markForWrite();

 

    hkVector4 pos( x, y, z );

 

    hkpRigidBody* pRigidBody = m_pHavokRigidBody->getRigidBody();

    pRigidBody->setPosition( pos );

 

    pWorld->unmarkForWrite();

    pWorld->unlock();

}

< 캐릭터의 최대 이동속도 조정 >

두 번째 인자는 hkReal maxVelocity로 최대 속도를 높이고 싶다면 여기를 조정한다.

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

< m_loader( hkLoader ) delete시 주의 사항 >

hkLoader 삭제시 hkpWorld를 먼제 삭제후에 삭제한다.

HavokTest::~HavokTest()

{

    ......

    m_world->unlock();

    {

        m_world->markForWrite();

        m_world->removeReference();

        m_world = HK_NULL;

    }

 

    delete m_loader;

}

< hkpCylinderShape를 충돌체로 사용하기

헤더 파일 추가 : #include <Physics/Collide/Shape/Convex/Cylinder/hkpCylinderShape.h>
hkpCapsuleShape 대신 hkpCylinderShape를 사용하면 된다.

프로젝트 :   HavokTest.zip
HavokText.zip은 "hk2010_2_0_r1\Demo\Demos\MyTset\HavokTest" 폴더아래 소스를 푼다.

리소스 : MyTest.zip
MyTest.zip은 "hk2010_2_0_r1\Demo\Demos\Resources" 폴더에 압축을 푼다.