Post List

2017/11/28

Unreal4__1_이동과_카메라

[ 작업 목록 ]
1. 캐릭터 이동 및 카메라 제어

언리얼에서 제공하는 3인칭 기본 코드를 사용하지 않고, 한번 내가 구현해보고자 만들어보았습니다.
기능은 언리얼 3인칭 카메라와 동일하다고 보면되고

idle상태에서는 플레이어를 중심으로 회전하며, run 상태가 되면 플레이어는 카메라의 view 방향을 바라보며
이동하게 됩니다. 이동 중 좌우 이동은 플레이어만 회전하여 이동하게 되죠.


Run 상태일때 좌우 이동은 현재 카메라가 바라보는 방향에서 플레이어만 45도로 회전하여 이동하며, 전진상태가 아닌 좌우 이동을 할 때에는 카메라가 바라보는 방향에서 플레이어만 90도로 회전하여 이동한다.


 idle 상태일때는 마우스 움직임에 따라 카메라 회전이 이루어지며, run상태로 바뀔때 플레이어는 카메라가 바라보는 방향으로 회전하여 다시 이동합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    // 두 벡터의 사이값 구하기.
    float fDot            = FVector::DotProduct(vecCamDir, vecMyDir) / (vecCamDir.Size() * vecMyDir.Size());
    float fCos            = FMath::Acos(fDot);
    float fAngle         = FMath::RadiansToDegrees(fCos);
    fAngle = FVector::CrossProduct(vecCamDir, vecMyDir).Z > 0 ? fAngle : -fAngle;
    // 카메라 방향을 바라보도록 회전시킨다.
    if (angle < 0.f)
    {
        // 왼쪽을 바라보고 있다.
        AddControllerYawInput(100.* GetWorld()->GetDeltaSeconds());
    }
    else if ( angle > 0.f)
    {
        // 오른쪽을 바라보고 있다.
        AddControllerYawInput(-100.* GetWorld()->GetDeltaSeconds());
    }
cs

플레이어가 카메라가 바라보는 방향으로 회전시키는 부분입니다.

우선 카메라와 플레이어가 현재 각자 바라보고 있는 ForwardVector값을 얻어옵니다.
그리고 두 벡터의 사이값을 구해 각도의 크기를 서서히 줄여주었습니다.

우선 벡터의 사이값을 벡터의 내적을 이용하여 구한 다음, 백터의 외적을 이용해 Z축을 기준으로 
실제 플레이어가 어느 방향을 바라보고 있는지 판단하여, 벌어져 있는 각도를 서서히 줄여주어 자연스러운 회전과 이동을 만들었습니다.

두 작업은 위와 동일하게 카메라와 플레이어의 forwardVector를 이용하여 각도를 구하였으며, 구한 각도를 어떻게 처리하냐의 차이뿐이였습니다.

* 액터의 이동을 제어하는 함수
1
AddMovementInput(GetActorForwardVector(), pValue * m_fSpeed);
cs
* 액터의 회전을 제어하는 함수
1
AddControllerYawInput(pValue * 100.* GetWorld()->GetDeltaSeconds());
cs