Game Development, 게임개발/게임 수학,물리

선형 변환- 크기변환(Scaling), 회전변환(Rotation) [게임수학]

게임이 더 좋아 2021. 3. 18. 03:08
반응형
728x170

선형 변환을 지난 글에서 살짝 알아보았고

 

결국 벡터 공간의 기저벡터를 바꾸는 것이 무엇에 이용되는지 알아볼 예정이다.

 

그 중 크기 변환과 회전 변환을 알아보겠다.

 

 


 

크기 변환은 우선 쉬운 변환이다. 

 

벡터의 2가지 성질인 방향과 크기 중에서 크기만 바꾸는 것이다.

 

크기를 바꾸는 변환을 T라고 한다면 이렇게 표현할 수 있을 것이다.

 

 

예를 들어서 v가 (1,2,4)라고 한다면 이렇게 된다.

 

 

간단하다.

 

실제로 계산을 하기 위해서는 위처럼 나타내는 것보다는 행렬로 하는 것이 좋은데

a,b,c만큼 변환한다고 하자

행렬로는 이렇게 나타낸다.

M이 변환하는 행렬이다.

++ 이전 시간에 배웠다.

 

 

변환된 이후의 모습이다.

 

보면 행렬의 특징을 볼 수 있는데

주대각성분을 제외한 모든 성분이 0이다.

a,b,c는 각 축에대한 크기 비율이다.

직관적으로 이해하기 쉽다.

 

 

 

여기서 크기변환의 역행렬도 알아봐야한다.

**항상 행렬은 역행렬과 짝지어서 다닌다고 생각하자

 

근데 이것도 직관적으로 알 것 같다.

각 성분의 역수를 취해주면 다시 원래 크기로 되돌아갈 듯 하다.

 

 

 

굳이 역행렬을 구하려고 노력하지 않아도 기하학적 성질을 파악해 구할 수도 있다.

++기하학적으로 의미가 있는 경우에만 해당한다

 


 

이번엔 회전변환이다.

 

그 중에서도 좌표축을 기준으로하는 회전변환이다.

 

우리는 고등학교나 중학교 시절 좌표평면에서 회전변환을 이미 배웠다.

사실 좌표공간으로 확장된 것 뿐이지 본질은 변하지 않았다.

 

하지만 공간에 온 순간 조금 더 고려할 사항이 많아진 것 뿐이다.

 

좌표축을 기준으로 회전변환을 하려면

1. 기준이 되는 좌표를 구해야 한다.

2. 얼마나 회전을 할 지 정해야 한다.

3. 시계 방향, 반시계 방향같은 회전 방향을 정해야 한다.

(하지만 일반적으로 좌표계에 따라 양의 방향 음의 방향으로 구분하며 좌표계마다 방향이 달라진다)

 

그 때도 예를 들었지만 한 번 더더더더 보자

 

 

그렇다면 이제 표현하는 방법은 어떻게 될까??

 

z축을 기준으로 xy 평면 위에 있는 벡터를 회전시켜보자

일단 z축을 기준으로 하므로 z성분에는 변화가 없을 것이다.

다만 x,y에 대해 알아보아야 하는데

쉬운 방법은  x,y를 2차원 좌표계로 옮겨서 회전시켜보는 것이다.

 

 

**회전에 대해서는 직교좌표계보다 극좌표계를 더 많이쓴다.

 

 

회전을 한다고 해서 원점과의 거리가 달라지지는 않으니까

 위와 같이 표현을 한다.

("축과 이루는 각","원점과의 거리") 이렇게 표현하고는 한다.

 

때문에 각 좌표를 삼각함수를 이용해서 나타낼 수 있다.

위와 같은 경우에는

x좌표는 코사인으로 y좌표는 사인으로 나타낸다.

 

 

 

즉, 3차원 공간에서 z축을 기준으로 임의의 각

 

 

그렇게 되면 좌표에 대해서 이렇게 나타낼 수 있다. 

 

 

좌표를 어떻게 구하느냐?? 삼각함수 덧셈법칙을 이용해서 전개한다.

그렇게하면 좌표와의 관계를 알 수 있다. 그렇고 그렇게 구한다.

 

즉, z축을 기준으로 a만큼 회전시키는 변환은 어떻게 표현할 수 있느냐??

 

 

 

이런 것은 외울 필요는 없다. 다만 어떻게 나오는지만 알면 된다.

 

행렬로는 어떻게 표현하는가?

 

 

무엇인가 다르다고 생각하겠지만 주대각성분만있는것이 아닌 것을 볼 수 있다.

z축 성분은 바뀌지 않기에 저렇게 되어있더이다.

 

나머지 x,축, y축도 해보면 어렵지는 않다. 귀찮을 뿐

각 축에 대해서 회전변환을 외운다기 보다는... 유도를 어떻게 했는가?

기준 축을 찾으면 바뀌는 성분이 있나 없나 찾아보는 것부터 차근차근 진행하면 된다.

 

 

행렬은 역행렬과 같이 다닌다고 했다.

역행렬도 알아보자.

회전변환 역시.. 기하학적인 의미를 알아보면 간단해진다.

a만큼 회전했으면  -a만큼 회전하면 다시 돌아가지 않겠나?

 

그렇다. -a를 넣어주자

x축 회전 변환의 역행렬을 보자

 

 

 

**사인 그래프를 생각해보면 부호가 바뀌는지 잘 숫자도 바뀌는지 알 수 있다.

 

조금 더 쉬운 방법이 있었는데

나는 몰랐다가 알게 된 방법이다.

 

우리가 지금 변환행렬을 보면 얘들은 직교 행렬,orthogonal matrix한 것을 알 수 있다.

**직교 행렬이라는 것은 행렬을 이루는 열 벡터 또는 행 벡터들이 서로 정규 직교(orthonormal)인 경우를 말한다.

??? 뭔 말이래???

**다시 말하자면 두 벡터가 정규 직교란 의미는 두 벡터가 길이가 모두 1이고 서로 수직일 경우를 말하는 것이다.

 

**수직인 경우를 이용한다고 했다.

만약 여기서 수직인 벡터의 내적은 0인 것을 생각했다면

칭찬해~

 

난 못했다.

 

예를 들어 다시 x축 회전 변환 행렬을 보자

++위의 역행렬에 다시 -를 넣어서 계산해보자

 

 

그렇게 되면 행렬을 봤을 때

모든 열벡터가 단위 벡터가 되는 것을 볼 수 있고

 

 

 

이들이 서로 수직임을 알 수 있다.

**내적을 해본다

 

 

 

?? 근데 역행렬 어떻게 구하는지 무슨 상관이냐????

 

이제 상관이 있다.

사실 직교 행렬의 역행렬은 사실 그 행렬의 전치 행렬과 같다.

 

 

또 하나 신기할 것 같은 사실은

직교 행렬끼리의 곱은 그 결과도 직교행렬이 된다는 점이다.

 

그럼 이제 쉬운 것 말고 

 

축이 x,y,z가 아니고 임의로 축을 잡을 땐 어떻게 할까...?

역시 이러한 회전변환도 벡터 공간을 벗어나지 않을 것임을 직관적으로 안다.

하지만 어떻게는 감이 잘 안온다.

 

다음 글에서 배워보자

 

 

반응형
그리드형