좌표계

  • 공간 상의 위치를 수치적으로 표현하기 위한 체계
  • 위치 정의, Transform, 물리적 충돌처리, 렌더링 등을 변환 및 계산할 때 사용한다.
  • 2차원 공간과 3차원 공간의 위치를 정의하는 2D좌표계, 3D좌표계
    • 2D : 모니터와 같은 좌표계로 x,y 좌표를 가지고 있다
    • 3D : 3차원 공간에서의 위치를 정의하며 x,y,z좌표를 가지고 있다.
  • 직교 좌표계
    • 축들이 서로 직각을 이루는 좌표계
    • Ex) 언리얼 에디터의 기즈모(Gizmo)의 Transform
  • 극 좌표계
    • 위치를 각도와 거리로 정의한다.
    • Ex) 항공기의 목적지나 여행방향을 정해주는 항행
  • 구면 좌표계
    • 구를 기준으로 한 반지름, 방위각 고도각
    • Ex) 대기 과학, 천문학, 지리학 등 지구나 다른 천체의 표면을 설정할 때

왼손 좌표계 / 오른손 좌표계 - https://dev-igner.tistory.com/51

 

왼손 좌표계

  • 왼손의 엄지, 검지, 중지를 각각 X,Y,Z 축 방향으로 펼쳤을 때 벡터의 외적이 정의되는 것.
  • Z축이 화면 안쪽으로 향한다.
  • 시계 방향으로 회전한다.
  • D3DX, 언리얼 엔진이 왼손 좌표계를 사용한다.

 

오른손 좌표계

  • 오른손의 엄지, 검지, 중지를 기준으로 X,Y,Z 축을 방향으로 펼치는 것
  • Z축이 화면 바깥쪽으로 향한다.
  • 시계 반대 방향으로 회전한다.
  • OpenGL, 블렌더 등이 오른손 좌표계를 사용한다.

 

 

 

 

언리얼에서의 좌표계

좌표계 사이의 변환은 World To View, TranslatedWorld To View처럼 X To Y 형태의 이름으로 표현한다.

월드 좌표계

  • 게임 월드의 기준점 (0,0,0)을 기준으로 모든 객체의 위치와 방향이 정의된다.
  • 건물, 나무, NPC같은 static한 객체들의 위치 배치
  • 플레이어 캐릭터의 위치를 미니맵에 표시

로컬 좌표계

  • 특정 객체를 기준으로 상대적인 위치와 방향을 정의한다.
  • 캐릭터의 손 위치를 기준으로 무기를 배치
  • 차량에서 탑승자 캐릭터의 위치 배치

 

카메라

  • View (CameraSpace)
    • 카메라의 시야 범위를 정의하는 것
    • 카메라의 시야에 따라 객체의 가시성을 판단할 떄 사용한다. (Frustum Space)

스크린

  • 모니터 2D화면을 x,y 좌표로 나타낸다.
  • 픽셀 단위로 화면상의 위치를 정의한다.
    • UI 또는 HUD를 배치하는데 사용한다.

 


https://dev.epicgames.com/documentation/ko-kr/unreal-engine/coordinate-system-and-spaces-in-unreal-engine

https://lalyns.tistory.com/entry/%ED%94%84%EB%9F%AC%EC%8A%A4%ED%85%80-%EC%BB%AC%EB%A7%81-%EB%B7%B0%EC%A2%8C%ED%91%9C%EA%B3%84

'게임수학' 카테고리의 다른 글

게임수학 - 삼각함수  (1) 2025.01.21
게임수학 - Matrix (행렬)  (0) 2025.01.13
게임수학 - Vector(기하)  (0) 2024.12.31

정의

  • 크기와 방향을 가진 수학적 개체
  • 2D(x,y), 3D (x,y,z)로 표현한다.
  • 단위벡터  - 길이가 1인 벡터
  • 영벡터 - 길이가 0인 벡터
  • 정규화 - 벡터를 벡터의 길이로 나누어 1로 만든다
  • 내적 - 두 벡터가 이루는 각도를 구한다.
  • 두 개의 벡터에 수직인 벡터를 구한다.

 

 

이동

  • 매 시간(Sec)동안 위치 업데이트
    • NewPosition(Vector) = OldPosition(Vector) + (Velocity x DeltaTime)
      • Velocity : 초당 이동 값
      • DeltaTime : 프레임 당 시간(초)
        • Ex) FPS가 60일 경우, DeltaTime = 1/60 (0.01666...)
      • Tick 이벤트 내 Delta Seconds를 사용한 위치 업데이트
  • 프레임 기반 이동값
    • NewPosition(Vector) = OldPosition(Vector) + Velocity
      • 프레임 속도에 따라 이동거리가 변동될 수 있다.
      • Tick 이벤트에서 매 프레임 위치 업데이트

 

 

단위벡터 (Unit Vector)

  • 길이가 1인 벡터
  • 벡터가 가르키는 방향을 필요할 때 사용한다.
  • 언리얼에서 정규화를 통해 방향을 가져올 수 있다.
    • 블루프린트 : Normalize
    • C++ : GetSafeNormal / GetUnsafeNormal
      • GetSafeNormal : 벡터가 (0,0,0)일 경우, (0,0,0) 반환
      • GetUnsafeNormal : 벡터가 (0,0,0)일 경우, 오류 / 충돌 발생할 수 있다.
  • 캐릭터 이동, 카메라 회전, 물리엔진(힘의 방향 또는 충돌 처리)에 사용할 수 있다.

 

 

정규화 (Normalization)

  • 벡터를 벡터의 길이로 나누어 1로 만드는 것
  • 정규화 과정을 거쳐 방향만 남기게 한다
  • 본인 * (1 / 본인의 크기)
  • 벡터가 (0,0,0)일 경우 정규화가 불가능 하다.

정규화 과정

 

1. 벡터의 크기 계산

벡터의 크기 계산

2. 정규화 - 각 성분을 벡터의 크기로 나눈다.

정규화

 

 

벡터의 내적 (Dot Product)

  • 두 벡터가 이루는 각도를 구할 수있다.
  • 내적값을 통해 두 벡터 각도의 코사인 값을 구할 수 있다.
  • 정규화된 벡터의 내적 값은 -1 ~ 1 사이에 존재한다.
    • Dot > 0 : 두 벡터가 같은 방향
    • Dot < 0 : 두 벡터가 반대 방향
    • Dot = 0 : 두 벡터는 수직
  • 언리얼
    • 블루프린트 : Dot Product (V1, V2)
    • C++ : Dot ProDuct (V1, V2)
  • 캐릭터 시야각 판별 / 투사체 방향 확인 / 충돌 반사 계산 등에 사용할 수 있다.

 

내적 공식

벡터 내적

 

 

벡터의 외적 (Cross Product)

  • 두 개의 벡터에 수직인 벡터를 구하는 연산
  • 연산값은 크기와 방향을 모두 가지는 벡터값
  • A x B = -(B x A)
  • A x B = 0
    • A와 B가 평행일 경우
  • 두 벡터의 외적 크기 : 두 벡터가 만들 수 있는 평행사변형 넓이
  • 두 벡터의 외적 방향 : 오른손 법칙에 따라 방향이 결정된다.
  • 언리얼 : CrossProduct(Edge1, Edgw2)
    • FVector Edge1 : Point2 - 1;
    • FVector Edge2 : Point3 - 1;
  • 캐릭터의 회전 방향 / 카메라 업벡터 계산 등에 사용한다.

 

외적 공식

벡터 외적

 

 


https://designerd.tistory.com/entry/DirectX12-Vector

'게임수학' 카테고리의 다른 글

게임수학 - 삼각함수  (1) 2025.01.21
게임수학 - Matrix (행렬)  (0) 2025.01.13
게임수학 - 왼손좌표계, 오른손좌표계  (1) 2025.01.02

델리게이트 Delegate

C++ 오브젝트 상의 멤버 함수를 가리키고 실행시키는 데이터 유형

특정 객체가 해야 할 로직을 다른 객체가 대신 처리할 수 있도록 만드는 보편적인 설계의 개념

델리게이트는 임의 오브젝트의 멤버함수에 동적으로 바인딩시킬 수 있으며, 그런 다음 그 오브젝트에서 함수를 호출할 수 있습니다.

또한 값으로 전달하는 경우 Heap에 메모리를 할당하게되는데, 델리게이트는 참조 전달을 위주로 하기 때문에 복사에도 안전합니다.

 

특징 

  • 특정 이벤트나 동작이 발생시에 호출할 함수를 미리 등록해주는 콜백 메커니즘
  • C++의 함수포인터와 비슷한 역할
    • std::function이 싱글캐스트 델리게이트와 비슷하다.
  • 결합도를 낮추고 유연한 이벤트 처리를 할 수 있다.
  • 델리게이트 선언시 어떤 데이터를 전달하고 받을것인지 인자의 수와 타입의 설계에 따라 사용되는 매크로가 결정된다.

 

델리게이트 선언 매크로

DECLARE_[델리게이트 유형]_DELEGATE_[함수 정보(RetVal_OneParam...]

 

  • Simple : 함수 하나만 바인딩 가능
    • DECLARE_DELEGATE
  • Multicast : 여러개의 함수가 한 이벤트에 바인딩이 가능하다
    • DECLARE_MULTICAST_DELEGATE, DECLARE_DYNAMIC_MULTICAST_DELEGATE
  • Dynamic : 블루프린트에서 바인딩이 가능하며, 런타임에서 바인딩 과 언바인딩이 가능하다.
    • DECLARE_DYNAMIC_DELEGATE,DECLARE_DYNAMIC_MULTICAST_DELEGATE

 

유형

  • DECLARE_DELEGATE : 1:1 형태로 전달시에 사용하며, C++에서만 지원한다.
  • DECALRE_MULTICAST : 1:N 형태로 전달시에 사용되며, C++에서만 지원한다.
  • DECLARE_DYNAMIC : 1:1형태로 전달하며, 블루프린트에서도 바인딩이 가능하다.
  • DECLARE_DYNAMIC_MULTICAST : 1:N형태로 전달하며, 블루프린트에서도 바인딩이 가능하다.

함수 정보

  • 인자가 없고 반환값이 없는 경우 - DECLARE_DELEGATE
  • 인자가 하나, 반환값이 없는 경우 - DECLARE_DELEGATE_OneParam
  • 인자가 하나, 반환값이 있는 경우 - DECLARE_DELEGATE_RetVal_OneParam
    • RetVal의 경우 블루프린트 형식을 지원하는 DYNAMIC에서만 선언이 가능하다.

 

바인딩

UObject 또는 공유 포인터 클래스 멤버에 델리게이트를 바인드 할 경우 오브젝트에 대한 레퍼런스를 낮은 응집도를 유지할 수 있으며, 오브젝트 소멸시 IsBound(), ExecuteIfBound() 함수를 호출하여 처리할 수 있다.

  • Bind() : 기존 델리게이트 오브젝트에 바인딩
  • BindStatic() : 정적 함수에 바인딩
  • BindUObject() : UObject 멤버 함수에 바인딩
  • AddStatic() : 함수 바인딩

실행

  • Execute() : 바인딩 되어있는지 확인
  • ExecuteIfBound() : 반환값이 없는 델리게이트의 경우
  • IsBound() : 모든 바인딩된 함수를 호출한다. (MULTICAST에서만 가능하다.)
    // 델리게이트 선언
    DECLARE_MULTICAST_DELEGATE(FSimpleMulticastDelegate);
    
    // 델리게이트 객체
    FSimpleMulticastDelegate OnEventTriggered;

    void TriggerEvent()
    {
        // 모든 바인딩된 함수 호출
        OnEventTriggered.Broadcast();
    }
};

void MyFunction1()
{
    UE_LOG(LogTemp, Warning, TEXT("Function 1 Triggered!"));
}

void MyFunction2()
{
    UE_LOG(LogTemp, Warning, TEXT("Function 2 Triggered!"));
}

void TestMulticastDelegate()
{
    MyClass Instance;
    Instance.OnEventTriggered.AddStatic(&MyFunction1); // 함수 바인딩
    Instance.OnEventTriggered.AddStatic(&MyFunction2); // 또 다른 함수 바인딩
    Instance.TriggerEvent(); // 두 함수 모두 호출
}

 

 

 

 

 

 

 

 


https://dev.epicgames.com/documentation/ko-kr/unreal-engine/delegates-and-lamba-functions-in-unreal-engine

이득우의 언리얼 C++ 게임 개발의 정석

+ Recent posts