Game Math] Cylindrical To Orthogonal(원통 좌표계의 좌표를 직교 좌표계의 좌표로 변환)
- 김영호
- 2022년 6월 18일
- 1분 분량
최종 수정일: 2023년 4월 25일
원통(Cylindrical) 좌표계 입력 >> 직교(Orthogonal) 좌표계 출력
- 원통 좌표계는 Distance(거리), Angle(각도), Z(높이)를 가지고 좌표를 표현한다.
- 직교 좌표계는 X(가로), Y(세로), Z(높이 or 깊이)를 가지고 좌표를 표현한다.
하지만 2 차원상에서 좌표 변환할 것이기 때문에 각 Z들은 제외했다.
목적
이전에 만들었던 Portal System에서 포탈간의 차이각, 월드상의 각도 등이 고정되어있는 부분을 포탈과 플레이어의 상대적 위치를 계산함으로써 자유롭게 배치 할 수 있게 하기 위한 사전 준비.
원통 좌표계를 사용한 이유는 포탈의 right Vector를 기준으로 플레이어 방향 Vector의 내적을 구하면 나오는 각도를 그대로 사용할 수 있기 때문이다.
이론
원통 좌표계로 X축방향(1, 0)을 기준으로 플레이어의 위치(x, y)까지의 각도와 거리를 잰다.

위의 그림에서 r과 θ(Angle)는 원통 좌표계의 값이다. 이를 삼각함수를 이용하면 직교 좌표계의 X와 Y를 구할 수 있다.
x = r * Cos(Angle)
y = r * Sin(Angle)
이때 Angle은 Radian이어야한다.
구현
void CalculatePosition()
{
//직교 좌표계
float x, y;
//Degree >> Radian
float angle_radian = angle * 3.14f / 180f;
//원통 좌표계의 값(dist, angle_radian)으로 직교 좌표계의 좌표 구하기
x = dist * Mathf.Cos(angle_radian);
y = dist * Mathf.Sin(angle_radian);
//직교 좌표계 위치로 점(공) 이동
pointBall.transform.position = new Vector2(x, y);
//UI 표기를 위한 작업(소수점 2자리까지 보이기)
x = (int)(x * 100f) / 100f;
y = (int)(y * 100f) / 100f;
//UI
UpdateResultUI(x, y); //Text
DrawLine(); //Line
}
변수 angle은 영상에서 입력받고 있는 Angle로써 Degree로 입력받게 된다.
주의
원통 좌표계는 Radian를 사용
직교 좌표계는 Degree를 사용
상황에 맞는 Radian과 Degree간의 변환 필요