개발공부

벡터, 행렬

파란색까마귀 2022. 2. 13. 21:35

2015. 12. 1. 0:35

https://blog.naver.com/nagne2011/220554979706

 

<벡 터>

: 물체가 이동하는 방향

 

특징)

i)  (다이렉트9 에서는) 왼손좌표계를 사용

 

ii) 벡터의 크기(길이)는

  

(그러나 코드 내에 루트 연산이 들어가면 계산이 느려지므로 보통 제곱을 이용한다

 

iii)  노말벡터 : 벡터의 길이가 1인 벡터. 

일반 벡터를 노멀벡터화 시키는걸 '노멀라이징' (정규화) 라고 하며

 

의 방법을 이용해서 정규화한다

 

하므로 

iv) 벡터의 크기비교 : 각 항(x,y,z) 끼리 비교하여, x1 = x2, y1 = y2, z1 = z2등으로 비교하면 되지만

벡터는 보통 float값으로 비교등식이 엇나갈 경우가 있다

따라서 서로의 차이가 일정값 이하일경우 등식이라고 본다

 (단, 이때 A는 0.0001쯤의 극히 적은 소수)

 

 

 

< 벡터의 합 >

 

간단히 자릿수 끼리 더하면 된다

즉,

 

 

벡터의 차도 같은 방식이다

그래프로 그리면 아래와 같다
 
 
 
< 벡터의 곱 >
 
i) 벡터와 스칼라의 곱
 
(x,y,z) * a = (x*a, y*a, z*a)
 
이때 벡터*스칼라 인지, 스칼라*벡터 인지 중요하다
보통 스칼라를 뒤에 곱하는경우가 많다
 
 
ii) 벡터끼리의 곱
 
#내적(Dot)
벡터끼리의 내적을 구하는 방식으로 두 각의 각도를 유추할 수 있다
 
 
 
즉 Dot(a,b)는 스칼라값으로 나온다
그리고 이 내적은
 
a * b = a벡터의 길이 * b벡터의 길이 * cos$
이므로 아래의 식을 성립한다
 
 
 
 
#외적(Cross)
외적은 두 벡터의 진행방향과 수직인 벡터를 탐색할때 사용한다
 
a(1,2,3)
b(5,7,9)
 
Cross(a,b) = [ (2*9 - 3*7), (3*5 - 1*9), (1*7 - 2*5) ] 
             = (-3, 6, 3)
 
그래프로 표현하면 아래와 같다
   
 
구하는 방법은 간단하다
(a X b) 이니까, 즉 a가 앞에 있고 뒤로 b가 크로스되니까,
a위치에 왼손 날을 올려둔뒤 b방향으로 손가락을 접으면, 그때 엄지손가락의 방향이 
외적의 방향과 일치한다(c)
 
만약 (b X a) 일 경우 c의 방향이 반대가 된다
 
 
 
< 행 렬 > 
 
i) "상등이다" = 행렬A와, 행렬B가 상등이다
 
즉, 두 행렬의 모든 항목이 일치한다는 뜻
 
ii) 스칼라의 곱 = 행렬A * 5
 
 
 iii) 행렬의 합
 
각 항목끼리 합하면 된다
 
 iv) 행렬의 곱
행렬 곱의 법칙의 의해 곱하면 된다
단, A*b와 B*A의 값이 다르다 (교환법칙이 성립하지 않는다)
 
따라서 행렬끼리의 곱에선 좌우가 특히 중요하다
 
 
 v) 항동 행렬 : 행렬 각 항목의 대각선이 1인 행렬
(Identify = I)
항동 행렬은 어느 행렬과 곱해도 그대로 나온다
즉,  행렬 M * I = M 이고, I * M = M 이다
 
 
 vi) 역행렬 : 행렬 M과 그의 역행렬 M^-1을 곱할경우 그 값은 항동행렬이 나온다
즉, M * N = I 일때, N = M^-1 이다
 
 
 vii) 전치행렬 : 행렬의 맴버값이, 대각선을 기준으로 서로 변환되는개념
(불확실)
 
 
 
 
3D 프로그래밍으로 넘어가서,
Direx9에선 4x4 행렬을 주로 사용한다
 
4x4 행렬을 이용한 좌표점 변화는 세가지 종류가 있다
 
1) 스케일링 Scaling = 크기 변경
2) 로테이션 Rotaiton = 방향 회전
3) 트렌스레이션 Translation = 위치 이동
 
이때,
3D에서의 이동, 스케일링, 회전 등의 연산이 효율적으로 하기 위해 고안된 방법이 행렬을 사용하는 방법입니다.  
3차원 좌표를 표현하기 위해서는 (x, y, z)로 표현하게 되겠지요.  거기에 표준화계수라는 마지막 숫자를 하나 더 넣어 (x, y, z,w)로 표현합니다.   마지막 표준화 계수의 역할은 스케일 계수로 이해하시면 되겠습니다.  이 값에 비례하여 스케일 된다는 의미이죠.
즉 
      x = x / w;
      y = y / w;
      z = z / w;

그래서 행렬로 표현하면 4x4 행렬로 구성됩니다.   이렇게요.  ( x, y, z, 1 )  여기서 1로 함은 스케일을 안하겠다는 의미겠죠. 
 
1) 스케일링 = 크기변경
 
2) 로테이션 = 방향전환
 
각 로테이션(x,y,z)에 따라 방법이 다르다
 -> 왼손좌표계 이므로, 방향이 엄지를 두고 손이 감기는 쪽이 정방향 회전 이다
 
3) 트랜스레이션 = 이동
 
 
각 행렬의 곱은 순서가 중요하다
 
따라서  S→R,T 순서대로 적용시켜야 한다

 

728x90

'개발공부' 카테고리의 다른 글

c# try-catch  (0) 2022.02.13
c# 함수 상속  (0) 2022.02.13
c# 함수 기초  (0) 2022.02.13
C# 기초 자료형  (0) 2022.02.13
자료구조  (0) 2022.02.13