Make Unreal REAL.
article thumbnail
이득우의 게임 수학

 

게임 공간인 씬은 액터(또는 게임 오브젝트)의 집합으로 구성된다.

 

각 액터는 (위치, 회전, 크기)의 트랜스폼 정보를 갖는다.

 

 

책의 예제인 CK소프트렌더러의 씬은 순차 탐색(Sequential search)에 유리한 vector를 활용해, GameObject의 목록으로 정의된다.

  • 렌더링 과정에서 모든 게임 오브젝트의 순차 탐색이 빈번히 사용되기 때문이다.

 

// 책의 예제인 CK소프트렌더러에 정의된 씬
class GameEngine
{
public:
    const vector<unique_ptr<GameObject>>& GetScene() const { return _Scene; }
    vector< unique_ptr<GameObject>>::const_iterator SceneBegin() const { return _Scene.begin(); }
    vector< unique_ptr<GameObject>>::const_iterator SceneEnd() const { return _Scene.end(); }
    GameObject& CreateNewGameObject(const string & InName);
    GameObject& GetGameObject(const string & InName);
    
private:
    vector<unique_ptr<GameObject>> _Scene;
}

 

게임 오브젝트는 프랜스폼 정보를 갖는다.

 

// 책의 예제인 CK소프트렌더러에 정의된 게임 오브젝트
class GameObject
{
public:
    TransformComponent& GetTransform() { return _Transform; }
    const TransformComponent& GetTransform() const { return _Transform; }
    
private:
    TransformComponent _Transform;
}

 

트랜스폼은 (위치, 회전, 크기)의 정보를 갖는다.

 

// 책의 예제인 CK소프트렌더러에 정의된 트랜스폼
class TransformComponent
{
public:
    void SetPosition(const Vector2& InPosition) { _Position = InPosition; }
    void AddPosition(const Vector2& InDeltaPosition) { _Position += InDeltaPosition; }
    void SetScale(const Vector2& InScale) { _Scale = InScale; }
    void SetRotation(float InDegree) { _Rotation = InDegree; Update(); }
    void AddRotation(float InDegree) { _Rotation += InDegree; Update(); }
    Vector2 GetPosition() const { return _Position; }
    Vector2 GetScale() const { return _Scale; }
    float GetRotation() const { return _Rotation; }
    
private:
    Vector2 _Position = Vector2::Zero;
    float _Rotation = 0.f;
    Vector2 _Scale = Vector2::One;
}

 

트랜스폼을 구성하는 각 요소의 데이터와 아핀 변환 행렬은 다음과 같다.

  • 크기: 벡터 (sₓ, sᵧ)
  • 회전: 각 θ
  • 이동: 벡터 (tₓ, tᵧ)

 

아핀 변환 행렬

 

행렬 곱은 교환 법칙이 성립하지 않기 때문에, 변환의 순서를 정해야 한다.

 

나올 수 있는 경우의 수는 총 6가지다.

  1. S·R·T 이동-회전-크기
  2. S·T·R 회전-이동-크기
  3. T·S·R 회전-크기-이동
  4. T·R·S 크기-회전-이동
  5. R·T·S 크기-이동-회전
  6. R·S·T 이동-크기-회전

 

물체에 45° 회전과 (0, 1) 이동을 적용하면 아래와 같이 나와야 한다.

 

 

그런데, 이동을 먼저 하게 되면 아래와 같이 물체의 위치가 다른 좌표로 바뀌어 버린다.

  • 회전 대신 크기 변환을 해도 마찬가지로 다른 좌표가 나오게 된다.

 

 

이번에는 (2, 1) 크기 변환과 45° 회전을 적용해보자.

 

잘 됐다면 아래와 같이 나와야 한다.

 

 

그런데, 회전을 먼저 하게 되면 다른 물체가 되어 버린다.

 

 

따라서, 변환은 T·R·S 크기-회전-이동 순으로 진행되어야 함을 확인했다.

  • 이것은 사실 회전 변환이 물체의 형태를 보존해주는 강체 변환의 성질을 갖기 때문이다.

 

트랜스폼의 정보로 만들어지는 모델링 행렬(Modeling matrix) M은 다음과 같다.

 

'게임 수학 > 이득우의 게임 수학' 카테고리의 다른 글

리소스 저장소  (0) 2023.04.30
로컬 공간과 로컬 축  (0) 2023.04.29
텍스처 매핑과 UV  (0) 2023.04.27
무게 중심 좌표의 계산  (0) 2023.04.26
메시(Mesh)  (0) 2023.04.25
profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그