이득우의 게임 수학 책에서 제공하는 프로젝트 파일을 이용했습니다.
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 |