내적은 프로그래밍 등 실제 연산 할 때 필수로 쓰이고 엄청 많이 쓰이는 연산이다.

단어 내적의 "적" 은 쌓다, 저축 이런 뜻인데 두 벡터의 원소들을 각각 곱하고 차곡차곡 더한것이라는 뜻이다.

 

아래는 두 벡터의 a, b이다.

a의 성분을 (x1, y1, z1)라 하고

b의 성분을 (x2, y2, z1)라 하면

내적은 a·b = x1*x2 + y1*y2 + z1*z2이다.

보통 내적을 구할 때 공식은 a · b = |a| |b| cosθ라고 배우는데 이것이 왜 a·b = x1*x2 + y1*y2 + z1*z2과 같은지

증명 해보겠다.

 

먼저 내적을 증명하기전에 코사인 제2법칙을 알아야한다.

 

제1코사인 법칙을 먼저 알면 제2코사인 법칙도 쉽게 알 수 있다.

 

1. 제1코사인 법칙

위와 같은 삼각형이 있을 때 꼭지점(각도)는 대문자 A,B,C 꼭지점에서 마주보는 선분은 소문자 a,b,c로 나타내 준다.

이 때

를 제 1코사인 법칙이라고 한다.

 

2. 제2코사인 법칙

 

제1코사인 법칙

제1코사인 법칙에서 a = bcosC + ccosB에 a를 곱해주고 두번 째 공식에는 b를 세번째 공식에는 c를 곱해준다.

변형된 식을 다음과 같이 만들어 빼준다.

a^2 - b^2 - c^2 의 식에서 a^2 - b^2 먼저 풀어준다.

나온 값에 c제곱을 빼주게 되면 -2bccosA가 나온다.

 

a2를 기준으로 이향해줍니다.

3. 내적 증명

이제 제1, 2코사인 법칙에 대한 설명이 끝났으니 이어서 내적 증명을 해보겠다.

먼저 위와 같은 삼각형에서 제2코사인법칙에 의해

로 나타낼 수 있다.

 

제2코사인법칙을 이용해서 나타내주면 다음과 같다.

결과는 아래의 결과와 같다.

그리고 각각 선분의 크기를 구해주면 아래와 같다.

선분 AB의 크기

 

선분 OA의 크기

 

선분 OB의 크기

 

첫번 째 결과

에서

를 없애기 위해 아래와 같이 해준다.

 

계산한 결과 (1)의 결과를 얻을 수 있다.

두번 째 결과

각 벡터의 내적을 계산해보겠다. 위에서 구한 각 선분들 크기를 대입해주고 풀어주면 아래와 같이 나온다.

아까 (1)식과 (2)식을 비교해보면

(1) 결과

 

(2) 결과

 

2를 양변에 나눠주면 각 원소의 곱들의 합이 내적공식이 된다.

1. Look At

 

행렬에 대한 좋은 점은 만약 3개의 직각(또는 비선형)인 축을 사용하여 좌표 space를 만들면 3개의 축과 이동 벡터와 함께 행렬을 만들 수 있고 어떠한 벡터든지 이 행렬과 곱하여 이 좌표 space로 변환할 수 있다는 것이다. 이것이 정확히LookAt행렬이 수행하는 것이다. 그리고 이제 우리는 카메라 space를 정의하기 위한 3개의 직각인 축과 위치 벡터를 가지고 있으므로 우리만의 LookAt 행렬을 만들 수 있다.

 

 

R은 오른쪽 벡터, U는 위쪽 벡터, D는 방향 벡터, P는 카메라의 위치 벡터이다. 위치 벡터가 반대로 되어있음을 알아두어야 한다. 우리는 결국 world를 우리가 이동할 곳의 반대 방향으로 이동시키기를 원하기 때문이다. 이 LookAt 행렬을 우리의 view 행렬로서 사용하여 효과적으로 모든 world 좌표들을 우리가 방금 정의한 view space로 변환할 수 있다.

그런 다음 이 LookAt 행렬은 정확히 주어진 타겟을 바라보고(look) 있는 view 행렬을 생성한다.

1. 오일러각 

위의 비행기를 예로 들자면

z축 기준의 회전각을 roll

x축 기준의 회전각을 pitch

y축 기준의 회전각을 yaw라고 가정한다.

 

오일러각의 장점

- 오일러각에 의한 표현은 자유도 3에 3개의 계수를 저장하기 때문에 저장 공간 면에서는 유리하다.

- 회전각 자체를 그대로 저장하므로 표류의 문제도 없어진다.

 

x, y, z축 기준의 회전각을 각각 a, b, r이라고 하면 x, y, z축을 기준으로 순차적으로 회전한 결과는 다음과 같다.

 

비행기 그림을 예로 들면 롤링에 의해 z축을 기준으로 회전했다면 회전 결과 모델 좌표계의 x, y 축 방향은 이전과는

달라지게 된다.

 

이는 회전을 적용하는 순서가 중요함을 의미한다.

 

일반적으로 x축 기준으로 a, y축 기준으로 b 만큼 회전한 결과는 y축 기준으로 b, x축 기준으로 a만큼 회전한 결과와 일치하지 않게 된다.

 

즉 회전에 있어서는 교환법칙이 성립하지 않는다 는 뜻이다.

오일러 각 표현에서 회전을 보간하기 위해서는 오일러 각 자체를 보간하여야 한다.

 

물론 (x, y, z) 또는 (x, z, y) , (y, x, z) 등 임의의 축 순서를 정해서 축별로 점차 회전각을 증가 시킬 수도 있다. 

그러나 이경우 오일러의 각 표현은 몇가지 문제점이 발생하게 된다.

 

첫번째로 복합 변환의 결과을 예측하기 어렵게 된다.

 

예를 들어, 어떤 물체를 오일러 각(10도, 20도, 30도)에 의해 회전하고 이어서 회전한 좌표축을 기준으로 다시 (40도, 50도, 60도)로 회전할 경우 이는 원래 물체를 (50도, 70도, 90도) 로 회전한 결과와는 다르게 된다. 

그 이유는 이미 첫번째 회전변환에서 좌표축의 방향이 변했기 때문이다.

 

2. 짐벌락 현상

위의 첫 그림에서 x,y,z축이 직교함을 볼 수 있다. 이 상태에서 x축 기준으로 일정 각도를 회전했다고 가정하고 이어서 z축을 기준으로 90도 회전하면 두번째 그림의 모습 즉, x축과 y축이 나란해 진다. 따라서 만약 현재 상태에서 y축을 기준으로 회전을 가하면 이는 이전에 x축을 기준으로 이미 회전한 각도에 영향을 미치게 된다.  x축과 y축이 겹쳐버렸다는 의미이다.

 

이는 오일러각 표현의 자유도(DOF) 3에서 2로 줄어들었다는 것을 의미한다. 

 

 회전결과 모델 좌표축의 방향이 변하기 때문에 x, y, z축 기준의 회전이 더 이상 서로 독립적이지 않고 겹치게 되므로 위의 상황처럼 x, y축이 의존적(한축이 움직이면 다른축이 영향을 받게되는)으로 변하게 된다는 것. 

 

물론 짐벌락 현상은 어떤 축을 기준으로 90도 회전하는 특수한 경우에 발생하지만 그 결과 회전은 더 이상 x,y,z축을 기준으로 90도 회전하는 특수한 경우에 발생하지만 그 결과 회전은 더 이상 3차원 공간의 회전이 아니라 2차원 평면의

회전으로 변하게 되어 매우 부자연스러운 모습이 된다.

 

3. 축 각 표현

오일러 각은 모델 좌표계의 x,y,z 축을 기준으로 한다.

그러나 일반적으로 이처럼 고정된 축방향을 기준으로 하는 회전을 원하는 경우는 적다.

 

오히려 개발자들은 임의의 축 방향을 기준으로 물체가 회전하기를 원하게 된다.

 

임의의 회전축을 기준으로 하는 회전을 x, y, z에 대한 회전의 합성으로 표현한다고 하더라도 변화 과정을 직관적으로 알기 어려워 진다. 

 

이러한 부분을 보완한 조금 더 직관적인 회전 표현인 축-각(Axis-Angle)표현에 대해 설명해보겠다.

축-각 표현에서는 회전축과 회전각을 사용한다.

 

위 그림의 x, y, z는 물체 모델 좌표계의 좌표축이다.

 

축-각 표현에서 회전축은 임의로 지정할 수 있으며,

이는 모델 좌표계 원점에서 시작하는 단위 벡터 n(nx, ny, nz)로 나타낸다.

 

회전각은 이 축을 기준으로 회전할 각도를 반 시계 방향으로 나타낸 것이다.

 

 

R^n에서 R^n 자신으로의 선형변환은 선형연산자라고 한다.

 

대표적인 선형 변환으로 아래와 같은 선형변환을 생각할 수 있다.

이 4개의 변환이 각가 선형변환을 만족한다는 것은 아래 문제를 통해 확인 해볼 수 있다.

이 문제를 간단하게 증명을 해보도록 하겠다.

 

즉, 어떤 선형변환이 주어지더라도 기본단위벡터를 순서대로 대입하고 열을 구하여 표준행렬을 쉽게 만들 수 있다.

이를 정리하면 아래와 같다.

 

 

+ Recent posts