이득우의 게임 수학
게임 공간인 씬은 액터(또는 게임 오브젝트)의 집합으로 구성된다.
각 액터는 (위치, 회전, 크기)의 트랜스폼 정보를 갖는다.
책의 예제인 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가지다.
- S·R·T 이동-회전-크기
- S·T·R 회전-이동-크기
- T·S·R 회전-크기-이동
- T·R·S 크기-회전-이동
- R·T·S 크기-이동-회전
- 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 |