Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

승쨩개발공부

[Direct X] 벡터(Vector), 연산자, 내적, 외적 본문

DirectX 9

[Direct X] 벡터(Vector), 연산자, 내적, 외적

Unknowns 2021. 11. 11. 21:38

Direct의 주 목적

CPU가 아니라 GPU를 이용해 그래픽카드의 사용을 극대화 시키겠다!

 

 

D3DVECTOR3

D3DVECTOR3?

Direct 자료형이다 float형 3차원 자표 를 담는 D3DXVECTOR 구조체를 상속 받고있다

또한 여러 사칙연산과 비교연산이 연산자 오버로딩되어 제공된다

 

3차원 좌표 정보

X,Y,Z 축이 있다

Z 축의 기준은 왼손 , 오른손 좌표계에 따라 다르며, 그 기준은 우리가 보는 눈에서 물체 까지의 방향에

따라서 + , - 가 나뉘어진다.

 

Ex) 왼손 좌표계는 모니터 가로(X), 세로(Y) 라고 표현했을떄

Z축은 내 눈이 모니터에 가까워 질수록 + , 멀어질수록 - 로 표현된다. 

 

 

Direct x 에서는 왼손 좌표계를 사용한다.

왼손 엄지와 검지를 총 모양으로 만든후  중지를 오른쪽으로 90' 꺾어보자 이럴떄

 

왼손 엄지 = +Y축의 양의방향

왼손 검지 = +Z축의 양의방향

왼손 중지 = +X축의 양의방향

 

양의방향 = +0 방향

 

으로 표현할수 있다

 

회전을 할때는 축을 기준으로 회전한다.

 

 

Vector?

백터의 정의

백터는 크기와 뱡향을 나타내는 수학적 도구 이다.

백터의 크기를 백터의 길이 라고도 한다.

플레이어가 가보지 않은 방향을 구할떄 백터를 사용한다.

방향백터의 개념 위치백터의 개념 둘다 사용한다.

 

 

 

벡터의 성질

백터는 화살표의 형태로 표현이 되는데 그 자체로 크기와 방향성을 가지고 있다.

 

0. 단위 백터 , 백터의 정규화

: 백터의 크기를 1로 만들겠다.

다른 백터와 연산을 할떄 백터의 길이로 나눠주는 작업을 생략하는 등

계산을 편리하게 하기 위해 미리 구하는것

 

1. 백터의 상등

백터는 위치가 없고 크기와 방향이 있다.

= 백터가 크기와 방향이 같으면 같은 백터로 취급한다.

 

 

2. 백터의 덧셈

위치 백터에 방향 백터를 더해준다.

= 위치를 변화 시키기 위해서 한다, 어떤 위치의 이동값을 설정할떄 사용한다.

 

X = A.x + B.x

Y = A.Y + B.y

가 된다.  A , B 이 두 백터는 교환법칙이 성립하므로 A+B , B+A는 모두 동일하다.

보통 이동값들을 그냥 계속 더하면 최종적인 위치가 나온다.

즉, 아래의 그림과 같다.  결과 값은 C 백터가 된다.

 

 

3. 백터의 뺼셈

X = A.x - B.x

Y = A.Y - B.y

가 된다. 

A 백터와 B백터 두개의 백터가 있을떄 A 에서 B로 향하는 백터를 구하고 싶다면

뺄샘을 이용한다.

B->A = A-B

A->B = B-A

어느 방향으로 보는지 방향 백터를 구할 떄 사용한다

아래의 그림과 같은 빨간 백터들이 결과 값으로 나온다.

 

Ex)

A 백터가 (1,3)  , B 백터가 (3,1) 일떄

A - B = (-2,2) B백터가 A백터를 바라보는 방향백터가 나오게된다

B몬스터 , A플레이어 라고 가정했을떄 몬스터플레이어를 바라보는 방향백터가 나온다.

 

B - A = (2,-2) A백터가 B백터를 바라보는 방향백터가 나오게된다

A플레이어 , B몬스터 라고 가정했을떄 플레이어가 몬스터를 바라보는 방향백터가 나온다.

 

위 와 같은 수식을 본다면?

뒷 백터값이 앞 백터값을 바라보는 방향백터가 나오게 된다!

 

 

EX) 몬스터가 플레이어를 따라감

m_tInfo.vDir = m_pPlayer->Get_Info().vPos - m_tInfo.vPos;   // Dir = 플레이어 vPos - 몬스터 vPos

float fLength = sqrtf(m_tInfo.vDir.x * m_tInfo.vDir.x + m_tInfo.vDir.y * m_tInfo.vDir.y); // 길이

m_tInfo.vDir.x /= fLength;          // 백터 정규화
m_tInfo.vDir.y /= fLength;          // 백터 정규화
m_tInfo.vDir.z = 0.f;


m_tInfo.vPos += m_tInfo.vDir * 3.f; // 몬스터의 위치에 플레이어가 있는 방향을 3.f 더함

 

 

4.백터의 곱셈(스칼라 곱)

(1). 내적

백터 A와 백터 B를 내적하면, 스칼라값이 나온다.

여기서 스칼라 라는 것은 크기만 있고, 방향이 없다, 백터는 크기와 방향이 있다. 이 것이 가장 큰 차이이다.

물리로 따졌을떄 백터와 스칼라를 힘이라고 봤을 떄 백터는 Force, 스칼라는 Power다.

Force는 어느 방향으로 어느정도의 크기로 밀었는지를 알 수 있는 힘,

Power는 그냥 단순히 힘이 쌔다, 약하다, 만 판단할 수 있는 힘이다.

그래서 스칼라 값은 그냥 하나의 수로 나오고, 백터는 X,Y,Z의 값이 나온다.

 

두 백터를 내적하면

내적 A(x,y,z)     B(x,y,z)

내적값(스칼라) = A.x * B.x + A.y * B.y + A.z * B.z 가 된다.

이 내적값(스칼라)를(을) acos()에 넣어주면 각도가 나온다.

Cos세타 = 내적값(스칼라) 이기 떄문이다

방향 백터와 방향백터의 끼임값 , 상수상태의 스칼라값 을 구하기 위해

몬스터가 바라보는 방향백터, 플레이어가 있는 곳을 바라보는 방향백터 이것에 끼임값

즉 상수값의 스칼라를 구해야 몬스터가 플레이어를 바라보는 형태로 회전 시킬수있다.

단 반드시 두 방향백터가 단위백터 이 여야 한다.

 

(2). 외적

D2D에서는 쓰고싶어도 쓸수가 없다.내적의 결과는 스칼라외적의 결과는 백터둘다 방향백터이여야 한다. 대신 꼭 단위 백터이여야 할 필요는 없다.두 백터와 동시에 직각을 구하는걸 외적 이라고 한다.= 회전하는 새로운 축을 만들떄 외적을 구한다.

 

외적 연산

 

외적 백터.x = A.y * B.z - A.z * B.y외적 백터.y = A.x * B.z - A.z * B.x외적 백터.z = A.y * B.x - A.x * B.y가 된다. 

기억하기 쉬우려면, 일단 2개의 곱한 값이 - 라는 것을 기억하고x의 성분에는 A와 B의 x를 제외한 yz 가 나오고 나머지도 마찬가지라는것을 기억하면 된다.순서는 xyz 라고 생각했을 떄 x 일때는 그 왼쪽에 있는 z.y 일때는 그 왼쪽에 있는 x.이런 순으로 A 백터의 값이 먼저 나온다. 그러면 뒤 의 값들은 유추해서 곱할수 있을것이다.

'DirectX 9' 카테고리의 다른 글

[Direct X] Direct X 기본 개념  (0) 2021.11.17
[Direct X] 행렬  (0) 2021.11.13
[Direct X] Direct X 시작하기  (0) 2021.11.11