수학/이득우의 게임 수학 - 실습 예제

스크린 좌표계 구조

monstro 2025. 10. 1. 14:48
728x90
반응형

- 개요

스크린 좌표계 데카르트 좌표계의 좌표를 픽셀로 변환하여 표현한다

프로젝트에서는 데카르트 좌표계경계값의 좌표오른쪽 하단의 픽셀로 변환하고

스크린 좌표계픽셀의 중점스크린 좌표계의 좌표로 변환한다

 

- 예제

struct ScreenPoint
{
public:
	// 4개의 생성자
	// - default 키워드를 사용한 기본 생성자 
	// - 2개의 정수값을 받아 픽셀을 설정하는 생성자 
	// - 2개의 실수를 받아 정수로 형변환하여 픽셀을 설정하는 생성자 
	// - 벡터의 X, Y 좌표를 받아 정수로 형변환하여 픽셀을 설정하는 생성자
	FORCEINLINE constexpr ScreenPoint() = default;
	FORCEINLINE explicit constexpr ScreenPoint(int InX, int InY) : X(InX), Y(InY) { }
	FORCEINLINE explicit constexpr ScreenPoint(float InX, float InY) : X(Math::FloorToInt(InX)), Y(Math::FloorToInt(InY)) { }
	FORCEINLINE explicit constexpr ScreenPoint(const Vector2& InPos) : ScreenPoint(InPos.X, InPos.Y) {}

	...

	// 데카르트 좌표계의 벡터 좌표를 스크린 좌표계의 픽셀로 변환하는 함수
	FORCEINLINE static constexpr ScreenPoint ToScreenCoordinate(const ScreenPoint& InScreenSize, const Vector2& InPos)
	{
		return ScreenPoint(InPos.X + InScreenSize.X * 0.5f, -InPos.Y + InScreenSize.Y * 0.5f);
	}
	
	// 스크린 좌표계의 픽셀을 데카르트 좌표계의 벡터 좌표로 변환하는 함수
	// 
	FORCEINLINE constexpr Vector2 ToCartesianCoordinate(const ScreenPoint& InScreenSize)
	{
		return Vector2(X - InScreenSize.X * 0.5f + 0.5f, -(Y + 0.5f) + InScreenSize.Y * 0.5f);
	}

	...

	int X = 0;
	int Y = 0;
};

 

위와 같이 ScreenPoint 구조체의 인스턴스를 사용하여 스크린 좌표계의 픽셀을 표현할 수 있다

ToScreenCoordinate 함수와 ToCartesianCoordinate 함수의 원리는 다음과 같다

  • ToScreenCoordinate 함수 : 화면의 크기(InScreenSize)와 데카르트 좌표계의 좌표(InPos)를 인자로 받음
    • X 좌표 : 좌표의 값을 화면의 중심에서 오른쪽으로 이동시켜 좌상단을 기준으로 스크린 좌표계x 픽셀 위치로 변환
    • Y 좌표 : 스크린 좌표계아래로 증가하므로 반전 + 화면 높이의 절반만큼 더하여 스크린 좌표계y 픽셀 위치로 변환 
  • ToCartesianCoordinate 함수 : 화면의 크기(InScreenSize)만 인자로 받음
    • X 좌표 : 좌표의 값화면 중심 기준으로 이동 + 픽셀 중심 보정을 위해 0.5 추가
    • Y 좌표 : 데카르트 좌표계로 증가하므로 반전 + 픽셀 중심 보정을 위해 0.5 추가 + 좌표의 값화면 중심 기준으로 이동
728x90
반응형