벡터 : 보통은 x, y축(2차원) 혹은 x, y, z 축(3차원)을 가진 공간 좌표.
방향벡터 : 길이가 1인 벡터
게임을 만들다 보니 각도를 방향벡터로 바꿔야 하는 상황이 왔다.
조금 번거롭게 하면 가능은 하지만 최적화에도 안 좋고, 찾아놓으면 두고두고 쓸 수 있을 거라는 생각에 방법을 생각해 봤다.
처음에는 인터넷을 뒤졌는데 차라리 직접 생각해 내는게 빠를 거 같더라.
일단 규칙성을 찾아보려고 했다.
일단 명백하게 각도가 방향 벡터로 바뀔 수 있는 경우가 5개 있었다.
0도, 90도, 180도, 270도, 360도
0도와 360도는 같은 각도라 사실상은 4개인 샘이다.
0도 = 1, 0
90도 = 0, -1
180도 = -1, 0
270도 = 0, 1
360도 = 1, 0
몇가지 규칙성을 발견할 수 있었다.
-90도가 변할 때 x와 y가 변화한 값의 총합이 2다.
-x와 y의 변화값은 정확하게 반비례 한다.
-어떤 각도에서도 방향벡터의 길이는 1이다.
-대각선의 길이를 구하는 공식은 'a제곱 + b제곱 = c제곱'이다(피타고라스의 정리).
90도가 바뀔 때 x, y 변화값의 총합이 2라면,
45도가 바뀔 때 x, y 변화값의 총합은 1이다.
그러면 1도가 바뀔 때 x, y 변화값의 총 합은 2 / 90이다.
그 증거는 아래와 같다.
예 1) 2 / 90 * 90 = 2
예 2) 2 / 90 * 45 = 1
변화값의 총합을 구하고 나서는
'피타고라스의 정리'와 '방향벡터의 길이는 어떤 경우에도 1이다'를 이용해 x, y의 값을 구할 수 있다.
예를 들어 283도의 방향벡터를 구해야 한다고 가정해 보자.
1. 283도 안에 몇 개의 90이 있는지 계산한다.
283 / 90 = 3.???
여기에서 필요한 건 3이다.
90 * 3 = 270 이기 때문에 270도를 시작 지점으로 잡으면 되고
그렇기 때문에 시작이 되는 방향벡터는 (0, 1)이다.
2. 283에서 모든 90을 제외하면 몇의 숫자가 남는지 계산한다.
283 % 90 = 23
나머지 값이 23이니 '2 / 90 * 23'을 계산해 x, y 변화값의 총합이 '0.51111111111111111111111111111111'인 것을 알 수 있다.
3. 피타고라스의 정리를 사용한다.
a제곱 + b제곱 = c제곱(1)
즉, a제곱 + b제곱 = 1이다.
4. 시작 각도와 목표 각도를 확인한다.
시작 각도가 270도(0, 1)이었고 변화값이 0.511...이었다.
270 + 90이 360이니 시작 각도 270(0, 1)에서 360(1, 0)을 향해 움직인다는 걸 알 수 있다.
5. x, y 축의 변화 방향(+, -)을 확인한다.
시작 x축은 증가하고, y축은 감소한다.
6. 계산한다.
x, y의 값은 달라도 각각의 변화값 자체는 동일하니 변화값을 2로 나누어 x축에는 더해주고, y축에는 빼주면
283도의 방향벡터를 구할 수 있다.
0.51111111111111111111111111111111 / 2 = 0.25555555555555555555555555555556
x축 = 0 + 0.25555555555555555555555555555556
y축 = 1 - 0.25555555555555555555555555555556
283도의 방향 벡터 = (0.25555555555555555555555555555556, 0.74444444444444444444444444444444)
'게임개발 > 공부' 카테고리의 다른 글
프로젝트 탭의 에셋 코드로 일괄 변경하기. (0) | 2023.03.28 |
---|---|
스크립트간 Awake(), Start() 함수의 순서로 인한 문제. (0) | 2023.03.10 |
Dunk Shot_끝. 가이드라인 구현. (0) | 2022.11.16 |
경로 예상하기 (0) | 2022.11.12 |
따라하기_Dunk Shot (0) | 2022.11.10 |