반응형

제목 그대로 두 벡터 사이의 각도 구하기 & 각도 제한하기에 대해서 잘 나와있는 곳을 찾아서 링크를 건다.

 

https://www.reddit.com/r/Unity3D/comments/3jj2p5/clamping_angle_of_quaternion_issue/?ref=share&ref_source=link

 

Clamping Angle of Quaternion Issue

I've got a problem with my clamping of a quaternion for my camera. The code I have clamps the quaternion to the angle I want, but there is an...

www.reddit.com

예제는 유니티로 되어 있기는 하지만 언리얼 등에서도 그냥 따라 사용하면 될 듯 하다.

 

간단하게 각도 제한하기를 정리해보자면 좌우 / 상하로 나눠서 처리한다.

 

좌우 계산을 위해 구하고자 하는 방향 벡터를 UpVector를 기준으로 투영시키고 각도를 구한다.

 

참고로 각도를 구할때는 방향벡터와 UpVector와의 외적을 구해 각도의 부호를 결정한다.

 

각도를 구하고 나서 해당 각도가 제한될 각도와 비교하여 넘어섰다면 제한해준다.

 

해당 각도로 Foward 벡터를 이동시켜줄 Quaternion을 구해준다.

 

상하에 대해서도 같은 처리를 해주는데 전에 구한

 

Yaw에 대한 Quaternion을 이용하여 회전시키고 투영해준다.

 

그래서 Pitch에 대한 Quaternion까지 구하고 나서

 

Foward 벡터를 회전시켜주면 각도가 제한된 벡터를 구할 수 있다!

반응형

'수학 > 선형대수학' 카테고리의 다른 글

선형 대수학 EBook - Immersive Math  (0) 2018.08.18
그람 - 슈미트(Gram schmidt) 직교화  (0) 2017.12.21
반사 벡터  (0) 2017.12.15
벡터 - 내적  (0) 2017.12.12
프로그래머를 위한 선형대수 - 벡터와 공간  (0) 2017.10.29
Posted by msparkms
,
반응형

http://immersivemath.com/ila/index.html


선형 대수학을 설명해주는 책 중에서 진정한 EBook이라고 불릴만한 작업을 하신 분들이 있어서 공유한다.


선형 대수학을 설명하면서 관련된 예제들을 웹으로 잘 구현해 놔서 동적으로 위치를 바꿔보는등 테스트를 해볼 수 있다.


앞으로 이런식의 동적인 이북들이 많이 나올 것 같은 예감이 든다.


기회가 된다면 이런 프로젝트에 한번 참여해보고 싶기도 하다.

반응형
Posted by msparkms
,
반응형

주어진 벡터를 이용해서 직교인 벡터를 구하는 방법중 그람 - 슈미트 직교화라는 것이 있다.

이전에 올린 글인 벡터의 내적을 보면 내적을 이용해 벡터를 투영시키고 이를 원본 벡터에서 빼서 직교한 벡터를 구하는 부분이 있다.

이 방법을 반복한다고 보면 된다.


이미지로 매우 잘 설명된 유튜브 영상이 있어서 올린다.




반응형
Posted by msparkms
,
반응형

반사 벡터에 대해서 간단하게 알아보자.

입사벡터 I가 노말벡터가 N인 평면에 반사되면 반사벡터 R이 된다.


반사벡터를 구하는 공식이 기억이 안날때 머리속에 아래의 그림을 떠올리면 유추해내기 쉽다.

입사벡터 I를 원점으로 이동시킨다.

그 후에 벡터 V를 더해주면 반사벡터 R을 구할 수 있다.


벡터 V를 구하기 위해서 일단 이동시킨 입사벡터 I를 노말벡터 N에 투영시킨다.

노말벡터 N이 단위벡터라면 내적을 구한뒤 노말벡터를 곱해주면 될 것이다.


입사벡터 I와 노말벡터 N은 둔각을 이루기 때문에 -N 방향을 향할 것이다.

그렇기 때문에 계산한 벡터에 -를 붙여줘서 N 방향으로 바꿔준다.

이 벡터에 2배를 해주면 우리가 원하는 벡터 V를 계산할 수 있다.


위에 내용을 정리해서 식으로 나타내면 아래와 같다.

기억이 안날때는 위에 그림을 생각해내고 천천히 생각해보면 공식을 외우지 않아도 식을 떠올릴 수 있다!


참고자료

http://ogldev.atspace.co.uk/www/tutorial19/tutorial19.html


반응형

'수학 > 선형대수학' 카테고리의 다른 글

선형 대수학 EBook - Immersive Math  (0) 2018.08.18
그람 - 슈미트(Gram schmidt) 직교화  (0) 2017.12.21
벡터 - 내적  (0) 2017.12.12
프로그래머를 위한 선형대수 - 벡터와 공간  (0) 2017.10.29
벡터 - 외적  (3) 2012.08.22
Posted by msparkms
,
반응형

내적


벡터끼리의 곱 중에서 내적에 대해 알아보자.

참고로 외적에 대해서는 여기를 참고하자!


외적처럼 위키를 기준으로 정리하는 것이 아니라 

이번에는 게임 프로그래밍 관련된 수학책을 참고하여 정리해보자.

게임 개발할때 많이 사용하기 때문에 관련된 부분만 정리해도 꽤 많은 분량이 될 것 같다.

벡터와 관련된 부분에 많이 사용되고 많이 사용되는 증거로 엔진 내의 수학 함수 뿐만 아니라 

HLSL같은 쉐이더 등에서도 기본적으로 내적 연산 함수를 지원한다.


내적 연산


일단 영어로 내적은 dot product 혹은 inner product 라고 한다.

식으로 나타내면 \( a \cdot b \) 로 나타낼 수 있다. (dot!)

괄호가 쳐져있지 않는 한에는 벡터의 덧셈, 뺄셈보다 먼저 계산된다.


내적은 두 벡터의 각각 성분끼리의 곱의 합이다.

즉 스칼라값이 나온다는 것이다! (단순히 곱의 합이기 때문에 음수가 나올 수도 있다!)


식으로 표현하면 아래와 같다.

\( \begin{bmatrix} a_1 \\ a_2 \\ \vdots \\ a_n-1 \\ a_n \end{bmatrix} \cdot \begin{bmatrix} b_1 \\ b_2 \\ \vdots \\ b_n-1 \\ b_n \end{bmatrix} = a_1b_1 + a_2b_2 + \cdots + a_{n-1}b_{n-1} + a_nb_n \)

\( a \cdot b = \sum_{i=1}^n a_ib_i \)


예를 들어 3차원 벡터끼리의 내적이면

\( a \cdot b = a_xb_x + a_yb_y + a_zb_z \)


기하하적 의미


첫번째로 알아볼 의미는 투영이다.

parallelprojection1.jpg


a벡터를 b벡터에 투영시키면 a1벡터가 된다.

만약에 b가 단위벡터라고 하면(길이가 1인 벡터 - 방향만 나타낸다고 보면 된다.)

a벡터가 b벡터로 내려꽂았을때의 결과이다. (위에서 빛을 비췄을떄 그림자가 진다고 생각하면 된다.)

주의해야 할 점은 내적계산을 하면 결과가 스칼라이기 때문에 투영된 길이만 의미한다는 것이다.


두 벡터가 이루는 각도에 따라서 위와 같이 부호가 결정된다.

예각일 경우에는 양수 / 90도일때는 0 / 둔각일 경우에는 음수가 된다.

다르게 말하면 주어진 벡터 2개의 성분만 알아도 두 벡터가 대충 어떤 방향을 바라보고 있는지 알아낼 수 있다는 것이다.

게임 개발에서 이는 매우 중요한 정보이다.

특정 면을 기준으로 앞쪽에 있는가 뒤에 있는가를 판단한다던가 그림자를 계산한다던가 다양한 부분에 사용할 수 있다.


만약 투영되는 벡터가 단위벡터가 아니라면 어떻게 될까?

\( a \cdot (\mathrm{k}b) = a_x(\mathrm{k}b_x) + a_y(\mathrm{k}b_y) + a_z(\mathrm{k}b_z) \)

\( = \mathrm{k}(a_xb+x + a_yb_y + a_zb_z) \)

\( = \mathrm{k}(a \cdot b) \)


단위벡터가 아니면 내적된 결과에 길이를 곱해주면 된다.

위에 식을 보면 알겠지만 k값이 어디로 옮겨가도 동일한 결과를 얻을 수 있다.

\( (\mathrm{k}a) \cdot b = \mathrm{k}(a \cdot b) = a \cdot (\mathrm{k}b) \)


그리고 곱셈과 덧셈이 교환법칙이 성립하기 때문에 내적 또한 교환 법칙이 성립한다.

\( a \cdot b = a_xb_x + a_yb_y + a_zb_z = b \cdot a \)


교환법칙을 본 김에 분배 법칙도 살펴보자.

\( \begin{bmatrix} a_1 \\ a_2 \\ a_3 \end{bmatrix} \cdot \begin{bmatrix} b_1 + c_1 \\ b_2 + c_2 \\ b_3 + c_3 \end{bmatrix} \)

\( = a \cdot (b + c) \)

\( = a_x(b_x + c_x) + a_y(b_y + c_y) + a_z(b_z + c_z) \)

\( = (a_xb_x + a_yb_y + a_zb_z) + (a_xc_x + a_yc_y + a_zc_z) \)

\( = a \cdot b + a \cdot c \)


역시나 곱셈과 덧셈으로 이루어진 연산이기 때문에 분배 법칙이 성립한다.

벡터가 -가 붙어도 결국에는 방향이 반대인 벡터를 더하는 것이기 때문에 마찬가지로 성립한다.


같은 벡터끼리 내적을 구하면 어떻게 될까?

\( v \cdot v = v_xv_x + v_yv_y + v_zv_z = v_x^2 + v_y^2 + v_z^2 = \lVert v \rVert ^2\)

\( \lVert v \rVert = \sqrt{v \cdot v} \)

바로 해당 벡터의 길이를 구할 수 있다!


다음은 투영된 벡터를 이용해서 수직 벡터를 구하는 것이다.

b벡터가 단위벡터라고 가정하자.

a1은 투영된 벡터 a2는 우리가 구하고 싶은 수직 벡터이다.

b벡터에 a벡터를 투영시킨 벡터는 아래와 같다.

\( a_1 = ( a \cdot b )b \)

내적값은 스칼라값이기 때문에 벡터를 곱해줘야 벡터가 된다.


벡터의 덧셈을 이용해보면

\( a_1 + a_2 = a \)

\( a_2 = a - a_1 \)

\( a_2 = a - ( a \cdot b)b \)


내적에 다른 의미


parallelprojection1.jpg

v 벡터가 단위벡터라고 했을때 투영된 벡터의 길이가 내적이였다.

위 그림을 다시 보면 u 벡터를 빗변 투영된 벡터를 밑변으로 하는 직각삼각형으로 볼 수 있다.

u벡터의 길이가 1이라면 내적값을 직각삼각형의 성질을 이용해 표현할 수 있지 않을까?

바로 코사인값으로 표현할 수 있다.

\( \cos\theta = {\text{밑변} \over \text{빗변}} \)

내적을 코사인으로 표현할 수 있다는 것을 알게되었다.



내적의 기하하적 의미에서 왜 예각일때 양수이고 90도일때 0이고 둔각일때 음수인지 이해할 수 있게 되었다.

바로 그것이 코사인의 성질이기 때문이다.


cosine graph


위에서 내적이 각 벡터의 길이에 비례한다는 것을 알았다.

식을 일반화 시키면 아래와 같다.

\( a \cdot b = \lVert a \rVert \lVert b \rVert \cos \theta \)


또한 코사인값이 나왔으니 반대로 코사인의 역함수를 사용하면 각도를 구할 수 있다는 것도 알 수 있다.

즉 두 벡터의 성분값만 알면 두 벡터가 어떤 각도로 배치되어 있는지도 알 수 있다는 것이다!

각도를 구해야될때 사용하면 되겠다.


\( \theta = \arccos(a \cdot b) \)


지금까지 벡터의 내적에 대해서 알아보았다.

여기 있는 내용을 기반으로 벡터에 대해서 점점 더 정리하면 될 것 같다.


참고자료

https://en.wikipedia.org/wiki/Vector_projection

http://jccc-mpg.wikidot.com/vector-projection

https://math.libretexts.org/TextMaps/Calculus_TextMaps/Map%3A_Vector_Calculus_(Corral)/1%3A_Vectors_in_Euclidean_Space/1.3%3A_Dot_Product

https://www.mathsisfun.com/algebra/trig-sin-cos-tan-graphs.html


반응형

'수학 > 선형대수학' 카테고리의 다른 글

그람 - 슈미트(Gram schmidt) 직교화  (0) 2017.12.21
반사 벡터  (0) 2017.12.15
프로그래머를 위한 선형대수 - 벡터와 공간  (0) 2017.10.29
벡터 - 외적  (3) 2012.08.22
2x2, 3x3, 4x4 역행렬 공식  (0) 2011.06.16
Posted by msparkms
,
반응형

프로그래머를 위한 선형대수라는 책이 있다.

이 책을 기반으로 선형대수학을 정리해보려고 한다.

수식은 TeX 문법을 이용해서 적어본다.

처음 해보는거라서 조금 오래 걸릴듯 ㅠㅠ

책의 모든 내용을 담을 수는 없고 간단히 정리하는 느낌으로 적어보자.

부족한 내용은 생각나는대로 추가로 업데이트해보자.



벡터

벡터 : 수를 나열한 것 (수치의 조합을 정리하여 나타내는 기법)


종벡터 : 세로로 나열

횡벡터 : 가로로 나열


\( \begin{pmatrix} 1 & 2 & 3 \end{pmatrix}^{T} = \begin{pmatrix} 1 \\ 2 \\ 3 \end{pmatrix} \)

성분수를 명시하면 3차원 벡터


벡터를 표시할때는 두꺼운 글자로 표시

\( \mathbf{x}, \mathbf{v}, \mathbf{0} \)


영벡터 : 모든 성분이 0인 벡터

\( \mathbf{0} = \begin{pmatrix} 0, \cdots, 0 \end{pmatrix} \)


벡터의 연산 정의

덧셈 (같은 차원)

\( \begin{pmatrix} x_{1} \\ \vdots \\ x_{n} \end{pmatrix} + \begin{pmatrix} y_{1} \\ \vdots \\ y_{n} \end{pmatrix} = \begin{pmatrix} x_{1} + y_{1} \\ \vdots \\ x_{n} + y_{n} \end{pmatrix} \)


The addition of two vectors a and b


The subtraction of two vectors a and b


정수배 (임의의 수 c에 대해)

\( c\begin{pmatrix} x_{1} \\ \vdots \\ x_{n} \end{pmatrix} = \begin{pmatrix} cx_{1} \\ \vdots \\ cx_{n} \end{pmatrix} \)



벡터의 연산을 이용한 벡터의 성질

  1. \( (cc')x = c(c'x) \)
  2. \( 1x = x \)
  3. \( x + y = y + x \)
  4. \( (x + y) + z = x + (y + z) \)
  5. \( x + 0 = x \)
  6. \( x + (-x) = 0 \)
  7. \( c(x + y) = cx = cy \)
  8. \( (c + c')x = cx + c'x \)


기저

위에서 나온 덧셈과 정수배가 정의된 시스템을 선형공간이라고 한다.

평면 위에 화살표로 벡터를 표현하고 더하고 정수배를 할 수 있다.

하지만 특정 벡터의 위치를 표현하기 위해 좌표라는 번지를 매겨주는게 편하다.


기저 : 기준이 되는 한 쌍의 벡터

좌표 : 기준에서 얼마나 나아갔는가?


기저가 되기 위한 조건

  1. \( v = x_1e_1 + \cdots + x_ne_n \)
    • 벡터 v를 기저와 좌표로 나타낼 수 있어야 한다.

  2. 위 식에서 \( x_1, \cdots, x_n \)이 하나만 존재해야 한다.
    • \( u_1e_1 + \cdots + u_ne_n = 0 \) (영벡터)
    • 이면 \( u_1 + \cdots + u_n = 0 \) - 선형독립이라고도 한다.
    • 위 식은 \( x_1e_1 + \cdots + x_ne_n = x'_1e_1 + \cdots + x'_ne_n \)
    • 즉 \( (x_1 - x'_1)e_1 + \cdots + (x_n - x'_n)e_n \)와 동일하다고 보면 된다.


주어진 벡터 \( e_1,\cdots,e_n \)에 숫자 \( u_1,\dots,u_n \)를 결합하여 벡터를 만들 수 있다면

예를 들어 \( x = u_1e_1 + \cdots + u_ne_n \)를 만들었다면

이를 \( e_1,\cdots,e_n \)의 선형결합이라고 한다. (일차결합이라고도 한다.)

선형결합을 통해 벡터를 만들 수 있고 그 벡터가 유일하다면 선형결합을 한

\( e_1,\cdots,e_n \)를 기저라고 할 수 있다.


참고로 기저 벡터의 수를 차원이라고 한다.

위에 나왔던 좌표는 기저벡터를 생략한 숫자만 적어놓은 것이라고 보면 된다.

각 좌표의 숫자들을 더하거나 정수배를 계산하면 되고

실제 벡터로 계산할때는 기저벡터를 곱해주면 되는 것이다.


참고자료

프로그래머를 위한 선형 대수

https://en.wikipedia.org/wiki/Euclidean_vector

반응형

'수학 > 선형대수학' 카테고리의 다른 글

그람 - 슈미트(Gram schmidt) 직교화  (0) 2017.12.21
반사 벡터  (0) 2017.12.15
벡터 - 내적  (0) 2017.12.12
벡터 - 외적  (3) 2012.08.22
2x2, 3x3, 4x4 역행렬 공식  (0) 2011.06.16
Posted by msparkms
,
반응형



외적 (Cross Product)


정의



벡터 a 와 b 의 외적은 a × 로 정의된다.

외적의 결과로 나온 벡터 c 는 벡터 와 의 수직인 벡터로 오른손 법칙의 방향을 따른다.


외적 공식을 정리해보면 다음과 같다.



여기서 θ 는 벡터 a 와 의 각도이다. (0° ≤ θ ≤ 180°)
-> sin 값을 가지기 때문에 두 벡터가 평행하다면 외적의 결과는 0 벡터가 될 것이다.

벡터 n 은 위의 오른손 법칙에 의해 결정된 방향을 가지는 단위 벡터이다.

오른손 법칙을 이용해서 방향을 구하는 것이기 때문에 벡터 a 와 b 의 순서에 따라 결과가 달라진다.

즉 anti-commutive(교환 법칙 X)이다. 


대수학적 속성


교환 법칙

분배 법칙 <-> 결합법칙

스칼라 곱

자기 자신과의 외적
a × a = 0

0 벡터와의 외적
a × 0 = 0



좌표


 



다음과 같이 표준 기저 벡터 ijk를 가지는 좌표축이 있다고 하자.

기저에 대해서 외적을 적용해보면 아래와 같이 된다.
             
          
            


벡터 a 와 b 를 표준 기저 벡터를 이용하여 나타내면 아래와 같다.



이 표현을 적용해 외적을 구해보면 아래와 같다.

 \begin{align}
\mathbf{a} \times \mathbf{b} = & a_1b_1\mathbf{0} + a_1b_2\mathbf{k} + a_1b_3(-\mathbf{j}) + a_2b_1(-\mathbf{k}) + a_2b_2\mathbf{0} + a_2b_3\mathbf{i} + a_3b_1\mathbf{j} + a_3b_2(-\mathbf{i}) + a_3b_3\mathbf{0} \\
=& (a_2b_3 - a_3b_2) \mathbf{i} + (a_3b_1 - a_1b_3) \mathbf{j} + (a_1b_2 - a_2b_1) \mathbf{k}. \\
\end{align}

외적 연산으로 구해진 벡터 c 를 정리해서 적으면 

c = c1i + c2j + c3k = a × b

스칼라 값만 정리하면 아래와 같다.


c
c
c



행렬

  


외적은 행렬의 행렬식으로도 표현할 수 있다.


행렬식에 대해 자세한 내용은 행렬 파트를 참조하세요. 
(행렬식 해법 : Sarrus' rule or Cofactor expansion)

Sarrus' Rule 




위와 같이 전개하는 것을 Sarrus' Rule이라 한다. 외적 순서 외울때 사용해도 좋다.

Cofactor expansion



기하학적 의미

 


외적으로 구해진 벡터의 크기는 평행사변형의 넓이를 의미한다.

A


스칼라 삼중적


벡터 삼중적

삼중적의 경우에는 이런것이 있다 정도만 알아도 되지만 공식을 외워둔다면
복잡한 벡터식을 외적으로 묶어버리거나 아니면 다시 풀어버리는등의 도움이 될 것 같다.

위에서 배운 스칼라 삼중적의 크기는 평행사변형을 밑으로 하는 물체의 부피 크기를 의미한다.

V



간단히 식을 설명해보자면

(× c)는 평행사변형의 넓이가 될 것이고 거기에 a 를 내적하면 에 cos 값이 곱해진 의 길이가 나오게 된다.


게임 내에서의 쓰임    


* 좌표계 생성
뷰 벡터, 업 벡터, 오른쪽 벡터등을 만들어 낼 때 사용.

* 각도 & 방향 계산
sin 값이 있으므로 내적과 마찬가지로 각도를 구할 수 있고 방향 또한 구할 수 있다.

다른 쓰임이 생각나는 대로 업데이트 하겠음..ㅋ


나머지 내용도 많은데 내가 모르는 것들이기도 하고 아직까지는 저 정도 필요도 없어보이고..


더 깊게 수학공부를 해서 이해가 되면 다시 올리도록 하겠다.


 

반응형

'수학 > 선형대수학' 카테고리의 다른 글

그람 - 슈미트(Gram schmidt) 직교화  (0) 2017.12.21
반사 벡터  (0) 2017.12.15
벡터 - 내적  (0) 2017.12.12
프로그래머를 위한 선형대수 - 벡터와 공간  (0) 2017.10.29
2x2, 3x3, 4x4 역행렬 공식  (0) 2011.06.16
Posted by msparkms
,
반응형

Inverse matrix of 2-by-2 matrix, 3-by-3 matrix, 4-by-4 matrix


Inverse matrix of 2 $\times$ 2 matrix

There exists an inverse matrix of A when detA=ad-bc0, and it is

Inverse matrix of 3 $\times$ 3 matrix

There exists an inverse matrix of A when
detA=a11a22a33+a21a32a13+a31a12a23-a11a32a23-a31a22a13-a21a12a33
0, and it is

Inverse matrix of 4 $\times$ 4 matrix

If

then there exists an inverse matrix of A, and it is

where

Inverse matrix of NxN matrix

From the analogy of the above formulae, the computation time of inverse matrix of NxN matrix will be O(N3N!). Computing inverse matrix with Gauss-Jordan method, the method using LU decomposition, and the method using SVD, will take a computation time of O(N3) (not confident). I will recommend not to use the formula for calculating inverse matrix of NxN matrix which N >= 4.

 

http://www.cg.info.hiroshima-cu.ac.jp/~miyazaki/knowledge/indexe.html

------------------------------------------------------------------------------------------------

http://download.intel.com/design/PentiumIII/sml/24504301.pdf

가우시안 제거법을 이용한 방법, 크래머의 법칙을 이용한 방법, SIMD를 이용해 정리한 소스가 있는 PDF 파일


반응형

'수학 > 선형대수학' 카테고리의 다른 글

그람 - 슈미트(Gram schmidt) 직교화  (0) 2017.12.21
반사 벡터  (0) 2017.12.15
벡터 - 내적  (0) 2017.12.12
프로그래머를 위한 선형대수 - 벡터와 공간  (0) 2017.10.29
벡터 - 외적  (3) 2012.08.22
Posted by msparkms
,