87. 극좌표

직교형식으로 된 복소수 a가 3+2i라고 했을때 극형식으로 바꾸면 √13∠33.7이 나오게 된다.

 

극형식으로 표현된 √13∠33.7을 단위원의 삼각함수에서 유도된 공식에 극형식의 값을 대입하면 다시 직교형식으로 바꿀 수 있다.

 

직교형식과 극형식을 변환하는 일반식

 

복소수의 곱셈 결과는 두 복소수의 크기를 곱한것과 두 복소수의 각을 더한것과 같다고 했었다.

이를 이용하여 일반식으로 정리할 수 있다.

 

일반적으로 덧셈과 뺄셈은 직교형식으로 동류항끼리 계산하는게 더 쉽지만 곱셈과 나눗셈은 극형식으로 계산하는게 훨씬 쉽다.

그래서 두가지 방식을 다 알아야한다.

 

 

88. 회전 행렬

 

2차원 벡터 v=(x, y)를 θ만큼 회전시킨 결과가 v'=(x', y')라고 했을 때, 행렬로 표현하면 위와 같을 것이다.

열벡터에 곱해서 회전이 이루어지는 행렬을 찾는것이 이번 목표이다.

 

우선은 2x2 단위행렬을 떠올리자. 여기서부터 회전 행렬을 만들어 나갈 것이다.

단위행렬은 열벡터 2개로 나누어서 생각할 수 있다.

 

이 단위행렬에 의해 만들어진 벡터(1,0)로 원을 그리면 단위원이 될 것이고 θ만큼 회전시키면 인접변은 cosθ, 대변은 sinθ가 된다.

 

열벡터 한쪽이 채워졌다.

이번에는 다른 열벡터(0,1)를 θ만큼 회전시킬 차례이다.

 

두 벡터 모두 크기가 1이기때문에 길이 역시 똑같을 것이다. 하지만 sinθ가 2사분면으로 넘어왔기 때문에 음수가 된다.

 

단위행렬로 시작해서 회전행렬을 모두 구했다.

 

점 하나에 대한 회전이기 때문에 여러 정점으로 이루어진 오브젝트라면 각 정점마다 연산을 해야한다.

 

 

89. 오일러 행렬

2차원에서의 회전 행렬을 알아봤으니 이제는 3차원에서의 회전 행렬을 알아볼 차례이다.

마찬가지로 3x3 단위행렬에서 시작한다. 그리고 각 축을 기준으로 회전시킨다.

 

x축 기준 회전

x축을 기준으로 (1,0,0)을 아무리 회전시켜봐야 그대로이고 나머지 축은 θ만큼 시계방향으로 회전하게 된다.

기준 축으로는 값의 변화가 없기때문에 사실상 2개의 축, 즉 2차원에서의 회전이라고 보면 되기 때문에 나머지 축에 대해서는 2차원에서의 회전을 적용하면 된다.

 

그렇게 구해진 각 축별 회전행렬은 위와 같다.

 

보통 피치-롤-요 순으로 연산한다.

그런데 이런 오일러각 회전에는 짐벌락이라는 아주 중대한 문제가 존재한다.

 

 

90. 짐벌락

중간축에 의해 외부와 내부 2개의 축이 일치하게 되면 축 하나가 상실된다.

자주 사용하는 축을 기준으로 연산 순서를 바꿔서 짐벌락 발생을 최소화시킬수 있지만 짐벌락을 막는것은 불가능하다.

'이론 > 게임수학' 카테고리의 다른 글

[게임수학] 회전과 보간 (4)  (0) 2023.01.13
[게임수학] 회전과 보간 (3)  (0) 2023.01.13
[게임수학] 회전과 보간 (1)  (0) 2023.01.12
[게임수학] 벡터와 행렬 (4)  (0) 2023.01.11
[게임수학] 벡터와 행렬 (3)  (0) 2023.01.11

83. 벡터의 방향

벡터의 방향은 한 점에서 다른 점을 빼면 구할 수 있다. 하지만 방향이 아닌 각도로 알고 싶다면?

 

2차원 벡터라면 단순하다. x, y좌표가 그대로 인접변, 대변의 길이가 되기 때문에 arctan(y/x)를 해주면 쉽게 구할 수 있다.

하지만 3차원 벡터는 조금 더 까다롭다.

 

삼각함수는 3개의 축에 적용할 수 없기 때문에 2개의 축에 대한 삼각함수를 구해서 계산을 한다.

먼저 본래의 벡터 v를 xz축에 투영시킨 2차원 벡터 v'로 만들고 그 각 Φ을 구한다. 그리고 v와 v'를 이으면 v'에 직교하는 법선벡터가 만들어지며, v와 v'의 끼인각을 알아낼 수 있다.

y축과 v'는 서로 직교하기 때문에 90-끼인각을 계산하면 최종적으로 θ를 알아낼 수 있다.

 

근데 이 방법은 복잡하고 더 쉬운 방법이 있다.

 

먼저 각 축 x, y, z와 벡터 사이의 각을 각각 α, β, γ라고 하자. 그리고 벡터의 크기를 구하면 해당 벡터의 크기는 각 축에 공통적인 빗변의 크기가 될 것이고 각 축은 인접변이 될 것이다.

빗변과 인접변? cosθ이다.

 

벡터의 방향을 이런식으로 구하면 회전을 할 때 매우 유용하다.

 

 

84. 허수

기존의 실수체계는 1차원이었다면 허수는 2차원 평면으로 확장된다.

0에서 1까지의 거리와 0에서 i까지의 거리는 같다.

 

지수가 커질수록 기하급수적으로 커지거나 작아지는 실수와는 다르게 허수는 90º씩 계속 순환할뿐이다.

 

 

85. 복소수

실수부와 허수부로 이루어진 수이다.

그럼 이 복소수를 대체 왜 쓰는걸까?

그 이유는 회전 계산에 매우 유용하기 때문이다.

 

복소수의 연산은 기본적으로 벡터와 동일하다.

 

 

86. 복소평면

우선 복소수의 곱셈부터 알아보자.

 

단순히 전개식으로 풀어도 동일한 결과가 나온다. 단지 i의 제곱이 -1이라는 점을 이용하여 일반식으로 만든것일 뿐이다.

복소수의 곱셈의 결과를 그래프로 그려보면 꽤 재밌는 결과가 나온다.

 

각 복소수로 그려진 직각삼각형의 각도를 더한것과 같은 결과가 나오게 된다.

즉, 두개의 복소수를 곱하면 그 결과는 복소평면에서 회전을 한다. 또한 결과의 크기는 두 선의 크기를 곱한 값과 같다.

 

복소수의 표현 방식은 직교형식, 극형식 2가지로 구분할 수 있다.

'이론 > 게임수학' 카테고리의 다른 글

[게임수학] 회전과 보간 (3)  (0) 2023.01.13
[게임수학] 회전과 보간 (2)  (0) 2023.01.12
[게임수학] 벡터와 행렬 (4)  (0) 2023.01.11
[게임수학] 벡터와 행렬 (3)  (0) 2023.01.11
[게임수학] 벡터와 행렬 (2)  (0) 2023.01.11

78. 단위행렬

어느 행렬에 곱해도 언제나 1을 곱한것과 같다. 단위행렬은 반드시 정방행렬 이어야 한다.

 

 

79. 행렬식

2x2행렬의 행렬식

행렬식의 값이 0이 아니면 역행렬이 존재한다.

 

3x3행렬의 행렬식 (라플라스 전개식)

4x4행렬은 라플라스 전개식을 총 4번 수행하면된다.

 

 

80. 역행렬

 

2x2행렬의 역행렬 공식

3x3행렬은 조금 복잡하다.

1) 소행렬식을 먼저 구하고

2) 여인자 행렬로 변환하고

3) 여인자 행렬을 전치시킨뒤

4) 행렬식의 역수를 곱한다

 

 

소행렬식 -> 여인자 행렬 -> 전치행렬

 

최종적으로 위와 같은 식이 완성된다.

수기로 계산하게되면 과정이 복잡하고 많기때문에 실수에 유의해야한다.

보통 게임 엔진이나 라이브러리는 벡터와 마찬가지로 행렬 연산에 대한 함수를 제공해준다.

'이론 > 게임수학' 카테고리의 다른 글

[게임수학] 회전과 보간 (2)  (0) 2023.01.12
[게임수학] 회전과 보간 (1)  (0) 2023.01.12
[게임수학] 벡터와 행렬 (3)  (0) 2023.01.11
[게임수학] 벡터와 행렬 (2)  (0) 2023.01.11
[게임수학] 벡터와 행렬 (1)  (0) 2023.01.10

74. 행렬이란 무엇인가

2x2행렬 / 행벡터 / 열벡터

 

 

75. 행렬의 합 및 스칼라 곱셈

 

 

76. 인접행렬

가중치가 1인 무향 그래프의 인접행렬

그래프 탐색으로 길을 찾을때 사용될 수 있다.

 

 

77. 행렬의 곱셈

위에서 작성한 그래프의 인접행렬을 제곱하면 두번 이동해서 도착할 수 있는 경로의 갯수가 나오게된다.

세제곱을 하면 세번 이동해서 도착할 수 있는 경로의 갯수가 나오게된다.

 

2x2행렬의 곱셈

행렬의 곱셈은 내적과 같다.

 

70. 내적

내적의 결과는 스칼라값이다. 그래서 스칼라곱이라고도 부른다.

 

단위벡터를 기준으로,

◾ 두 벡터가 서로 평행하면 결과값은 1이다.

◾ 두 벡터가 서로 직교하면 결과값은 0이다.

◾ 두 벡터의 방향이 반대라면 결과값은 -1이다.

두 벡터의 직교를 기준으로 예각이면 양수, 둔각이면 음수가 된다.

 

내적을 사용할 수 있는 대표적인 예시로써 적이 플레이어의 앞이나 뒤에 있는지 여부를 판단하거나 적과 플레이어의 방향벡터를 내적하여 서로 마주보고있는지 또는 같은방향(뒤통수)을 보고 있는지를 판단할 수 있다.

즉, 시야판별 또는 백/헤드 어택에 사용할 수 있다는 얘기이다.

 

근데 이 모양이 코사인 법칙과 매우 닮아있다. 벡터의 크기는 선분의 길이와 동일하므로 치환해서 풀어보면 아래와 같은 식을 유도할 수 있다.

 

위에서 적은 예시 말고도 셰이더에서 빛이 어떻게 반사되는지 계산하거나 길찾기에서 너무 높은 경사를 지나가지 않도록 조절하는데 사용된다.

내적은 두 벡터끼리 비교하거나 두 벡터 사이의 각도를 재고싶을 때 사용할 수 있다.

 

 

71. 외적

외적의 결과는 두 벡터에 직교하는 법선벡터이다. 그래서 벡터곱이라고도 부른다.

내적과 달리 3차원 공간에서만 성립하고 교환법칙이 성립되지 않는다.

 

출처 : https://wikidocs.net/22384

또한 외적의 결과로 나온 벡터의 크기는 평행사변형의 넓이와 동일하다.

두 벡터의 각도가 0º 또는 180º라면 영역을 정의할 수 없기 때문에 외적의 결과는 영벡터가 된다.

내적과 비슷하게 각도와 관련되어 있기 때문에 유도해낼 수 있는 식이 존재한다.

 

외적은 내적과 함께 사용되어 충돌을 감지하거나 물체를 튕기게 하는데 사용된다. 외부 표면을 계산하는데 이용되기도 한다.

 

 

72. 반사

어떤 물체가 45º 각도로 벽에 충돌하게 되면 -45º 각도로 튕겨져 나와야 할 것이다. 이 때 반사의 기준은 법선 벡터가 된다.

위와 같은 상황은 벽에 부딪혀서 반사하게되면 y축과 z축은 그대로 유지되고 x축만 벽에 가로막혀서 부호가 반대로 바뀌게 게 될 것이다.

 

반사벡터 r을 구하는 식

먼저 벽의 정규화된 법선벡터 n을 외적으로 구하고 이후 내적과 스칼라 연산을 통해 반사벡터 r을 구하게 된다.

식과 결과 모두 정규벡터이기 때문에 본래의 속력을 곱해주거나 가속, 감속에 따른 추가 연산을 수행해주면 된다.

 

 

73. 평면으로의 사영

우선 어디에 쓰이는지 예시부터 들고 가자.

 

보통 레이싱 게임에서 차량이 벽에 비스듬히 부딪혔을 때, 그 즉시 멈추는게 아니라 위처럼 벽을 타고 이동하게 된다. 또는 rpg등의 게임에서 캐릭터가 벽에 붙은채로 비스듬하게 전진하면 느린 속도로 벽을 타고 이동한다.

이런것들은 이동 벡터를 평면에 사영시킴으로써 구현할 수 있다.

 

평면사영벡터 p를 구하는 식

법선벡터 n이 자기자신을 내적하는것은 n의 크기의 제곱과 동일하다.

만약 n이 정규화 되어있다면 분모는 언제나 1이기 때문에 계산이 조금 더 단순해진다.

 

사영벡터는 법선벡터와 직교하게된다.

 

 

내적 : 연산의 결과는 스칼라값

앞뒤 판별, 시야각 판별, 빛 반사, 경사의 통과 유무

 

외적 : 연산의 결과는 두 벡터에 직교하는 새로운 벡터

내적과 같이 사용하여 충돌감지, 반사, 평면사영등에 사용됨

+ Recent posts