캐릭터 기울기

4족의 사자나 호랑이가 경사진 곳을 이동 할 때는 경사면에 따라 모델을 회전 시킨다.

위의 그림을 보면 박스가 언덕의 경사에 따라 기울어져 있다..
다이렉트X를 왼손 좌표계가 아니라 오른손 좌표계로 샘플을 만들었다.

D3DXMatrixLookAtRH, D3DXMatrixPerspectiveFovRH 사용으로 오른손 행렬을 사용해야 되는걸로 알지만
최종적으로 D3DTS_WORLD에 넘겨주는 값은 왼손 행렬에 맞춘다.

구현 과정은 다음과 같다.

1. 지형 노멀 벡터 구하기
2. 지형 노멀 벡터와 Up 벡터의 외적으로 회전축 벡터 구하기
3. 지형 노멀 벡터와 Up 벡터의 내적으로 내적 회전값 구하기
4. 회전값을 회전각으로 변환
5. 회전축으로 회전각 만큼 행렬 구하기

void GetTerrainSlope(D3DXMATRIX& out, TerrainChunk* pChunk, float x, float y, float z )

{

    //1. 지형 노멀 벡터 구하기

    const MyVector3& vec = pChunk->GetNormal( x, y );

 

    //2. 지형 노멀 벡터와 Up 벡터의 외적으로 회전축 벡터 구하기

    MyVector3 rAxis, up = MyVector3(0, 0, 1);

    rAxis.Cross(vec, up);

 

    //3. 지형 노멀 벡터와 Up 벡터의 내적으로 내적 회전값 구하기

    float dot = vec*up;

 

    //4. 회전값을 회전각으로 변환

    float angle = acos(dot);

 

    //5. 회전축으로 회전각 만큼 행렬 구하기

    LH_RotationMatrix(out, rAxis, angle);

}

다이렉트X를 오른손 좌표계로 구현 하였기 때문에 회전축을 중심으로 회전하는 행렬 함수 LH_RotationMatrix()를 별도로 만들었다.

GetTerrainSlope( ) 함수를 분석하면 크게 어려움은 없을 것이다.

박스 모델의 이동은 마우스의 휠을 돌리면 된다.

소스: character_slope.zip