본문 바로가기

DirectX/수학/물리

게임수학과 물리 - 1벡터

게임수학과 물리
1. 백터

2. 항등백터

3. 백터의 크기(Norm)
여기서부터 삼각함수가 활용되는듯~
V = [Vx, Vy]
*피타고라스의 정리를 이용
||V|| = √(V²x, V²y)



4. 단위백터(백터의방향)
U²x+U²y = 1
단위백터 = V / V의크기
U = V / ||V||
U = V/ V²x+V²y
V = ||V|| * U
V = (√V²x+V²y) * U

5. 활용
백터의길이
sqrt(x*x + y*y + z*z));

단위백터(백터의방향)
Len = 단위백터
(x/Len, y/Len, z/Len)

6.벡터와 스칼라와의 곱
벡터와 스칼라의 곱은 원래 벡터의 크기를 스칼라만큼 곱해주는 것으로 k가 스칼라, A가 벡터일때  벡터와 스칼라와의 곱을 벡터의 성분으로 표현한다.
rA = Ar = [ rA1, rA2, rA3, ..........rAn]

7.내적
A * B = ||A|| ||B||cos(세타)
A = B  같다면 cos(세타)  = 1
cos(세타) = (A*B) / (||A|| * ||B||)
(세타) =  cos-¹ * ((A*B) / (||A|| * ||B||))

0<- (세타) < 90 일때는 코사인이 항상 양수
90< (세타) <- 180 일때는 코사인이 항상 음수

(세타) =90 일때는 내적이 0

7. 벡터의 투영
벡터 A를 두개의 단위 벡터 성분으로 분해
벡터 B로 투영해야 할때
내적을 유용하게 사용할수 잇다.

8. 활용
벡터의 내적(스칼라)
A · B
Ax * Bx , Ay * By, Az * Bz,
i+           j+           k            = 내적(스칼라)
세타 =  cos-¹(내적)  내적을 역행렬 cos 하면 세타가 구해진다
역행렬







벡터의 분해
vec2에 평행한 vec1의 분해벡터
= A'B(내적) =  vec1.Dot(vec2)
= ||B||² =  vec2(크기) * vec2(크기)
여기에 스칼라값을 B에 곱해줘야 함
= A투영B =  vec2벡터 * (AB내적 / A(크기) * A(크기)):스칼라 값임

9. 외적
A x B = ( ||A||  ||B|| sin(세타)) E(단위백터)
3차원인경우
A x B = (AyBz - AzBy, AzBx - AxBz, AxBy - AyBx)
     1 2 3
A = x y z
B = x y z
x = 32 - 23
y = 31 - 13
z = 12 - 21
벡터 A = [A1, A2, A3]
        {0    -A3    A2}
AA=  {A3     0   -A1}
        {-A2  A1     0}
A x B = (AA)b

3차원에서 두개의 축방향 단위 벡터를 통해 나머지 하나의 축방향 단위 벡터를 구할 수 있다.
x X y = z
y X z = x
z X x = y
y X x = -z
z X y = -x
x X z  = -y
외적의 응용
표면의 법선벡터(노말벡터) 계산

삼각형의 면적계산
A x B = (||A|| ||B|| sin(세타))E (E는 AxB 방향의 단위 벡터
||N|| = ||U x V|| = ||U|| ||V|| sin(세타)

ABC 의 면적 = 1/2 ||U|| ||V||sin(세타)
                  =  1/2 ||U x V||
                  =  1/2 ||N||
응용
void CVector::Corss( const CVector& u, const CVector& v)
{
x = u.y * u.z - u.z * v.y;
y= u.z * v.x - u.x * v.z;
z= u.x * v.y - u.y * v.x;
}

'DirectX > 수학/물리' 카테고리의 다른 글

속도와 속력  (0) 2010.07.19
게임수학과 물리 - 1행렬  (0) 2010.06.10
http://www.viper.pe.kr/cgi-bin/moin.cgi/TitleIndex  (0) 2010.06.09
삼각함수~  (0) 2010.06.09
삼각함수 항등식  (0) 2010.06.09