이득우의 게임 수학 책에서 제공하는 프로젝트 파일을 이용했습니다. 

 

CK 소프트 렌더러에서 좌표를 관리하기 위해 선언한 Vector2 를 살펴보았다.

평면의 벡터 값을 관리하는 Vector2 구조체의 선언 

struct Vector2
{

...

public:
FORCEINLINE constexpr Vector2 operator*(float InScalar) const;
FORCEINLINE constexpr Vector2 operator+(const Vector2& InVector) const;

...

static constexpr BYTE Dimension = 2;

...

FORCEINLINE constexpr Vector2 Vector2::operator*(float InScalar) const
{
	return Vector2(X * Scalar, Y * InScalar);
}

FORCEINLINE constexpr Vector2 Vector2::operator+(const Vector2& InVector) const
{
	return Vector2(X + InVector.X, Y + InVector.Y);
}

 

스택 공간에서 데이터를 처리하는 struct를 사용해 선언했다. 

그리고 FORCEINLINE 키워드를 사용해 컴파일 타임에 단순 치환될 수 있도록 구현했다.

constexpr 또한 그렇다. (constexpr 은 const와 다르게 컴파일 타임에 값이 초기화 되어 있어야한다. 이후 변경 불가)

또한 함수를 선언할 때 한정자 const를 사용해서 입력과 출력의 수정 권한을 명확하게 했다. 

 

operator를 통해 스칼라의 곱셈 연산과 벡터와 벡터의 합 연산을 수행할 수 있도록 구현했다. 

Vector2 가 갖고 있는 멤버 변수의 개수를 알 수 있도록, 부호없는 8비트인 unsigned char 를 typedef해 BYTE라는 자료형의 형태로 정적 변수를 선언했다.

 

제공 받은 프로젝트의 흐름은 Update2D -> Render2D이다.

Update2D에서 콘텐츠를 구성하는 물체의 최종 위치를 계산하고 이를 변수에 저장한다.

Render2D에서 변수에 저장된 물체의 위치를 읽고, 이를 중심으로 물체를 화면에 그려낸다. 

 

// 게임 로직과 렌더링 로직이 공유하는 변수 
Vector2 currentPosition(100.f, 100.f);

// 게임 로직을 담당하는 함수 
void SoftRenderer::Update2D(float InDeltaSeconds)
{
	...
    // 게임 로직의 로컬 변수
    static float moveSpeed = 100.f;
    
    Vector2 inputVector = Vector2(input.GetAxis(InputAxis::XAxis), input.GetAxis(InputAxis::YAxis));
	Vector2 deltaPosition = inputVector * moveSpeed * InDeltaSeconds;
    
    // 물체의 최종 상태 설정
    currentPosition += deltaPosition;
}

// 렌더링 로직을 담당하는 함수
void SoftRenderer::Render2D()
{
	...
	//렌더링 로직에서 사용하는 모듈 내 주요 레퍼런스
    
    // 밝은 회색의 선을 사용해 평행한 벡터를 표현
    static float Linelength = 500.f;
    Vector2 LineStart = currentPosition * Linelength;
    Vector2 LineEnd = currentPosition * -Linelength;
    r.DrawLine(LineStart, LineEnd, LinearColor::LightGray);

    // 벡터를 파란색 픽셀로 표현
    r.DrawPoint(currentPosition, LinearColor::Blue);
    r.DrawPoint(currentPosition + Vector2::UnitX, LinearColor::Blue);
    r.DrawPoint(currentPosition - Vector2::UnitX, LinearColor::Blue);
    r.DrawPoint(currentPosition + Vector2::UnitY, LinearColor::Blue);
    r.DrawPoint(currentPosition - Vector2::UnitY, LinearColor::Blue);
    r.DrawPoint(currentPosition + Vector2::One, LinearColor::Blue);
    r.DrawPoint(currentPosition - Vector2::One, LinearColor::Blue);
    r.DrawPoint(currentPosition + Vector2(1.f, -1.f), LinearColor::Blue);
    r.DrawPoint(currentPosition - Vector2(1.f, -1.f), LinearColor::Blue);

    // 벡터의 좌표를 우상단에 출력
    r.PushStatisticText("Coordinate : " + currentPosition.ToString());
}

 

실행 결과 

X축과 Y축의 입력을 사용해 벡터 currentPosition의 위치를 이동시킬 수 있으며, 벡터 currentPosition과 스칼라 곱셈이 만들어내는 평행한 선은 밝은 회색으로 표시되는 걸 확인할 수 있다.

 

 

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

벡터의 결합과 생성  (0) 2024.11.27
벡터의 크기와 이동  (0) 2024.11.27
벡터공간과 벡터(개념)  (0) 2024.11.27
함수  (0) 2024.11.25
게임 수학 카테고리  (0) 2024.11.25

+ Recent posts