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
반응형
'수학 > 이득우의 게임 수학 - 실습 예제' 카테고리의 다른 글
| 라인 클리핑 알고리즘의 구현 (0) | 2025.10.29 |
|---|---|
| 브레젠험 알고리즘의 구현 (0) | 2025.10.15 |
| 아핀 변환이 적용된 크기 변환 / 회전 변환 / 이동 변환을 구현 (0) | 2025.09.24 |
| 역행렬을 사용하여 하트의 원본 형태 유지 (0) | 2025.09.17 |
| 행렬을 사용하여 하트의 크기 변환 & 회전 변환 구현 (0) | 2025.09.10 |