top of page

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)까지의 각도와 거리를 잰다.

ree

위의 그림에서 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간의 변환 필요


  • Facebook
  • Twitter
  • LinkedIn

©2021 by 김영호_포트폴리오. Proudly created with Wix.com

bottom of page