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
#include <d3d9.h>
#include <d3dx9.h>
#include <algorithm>
#include <iostream>
 
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
 
using namespace std;
 
float myVec3Length(D3DXVECTOR3* pSrcVec)
{
    float TempLength = 0.0f;
    //pSrcVec->
 
    TempLength = sqrt(pSrcVec->x * pSrcVec->x + pSrcVec->y * pSrcVec->y + pSrcVec->z * pSrcVec->z);
 
    return TempLength;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    D3DXVECTOR3 LenVector = D3DXVECTOR3(1, 2, 3);
 
    cout << LenVector.x << LenVector.y << LenVector.z << endl;
    cout << D3DXVec3Length(&LenVector) << endl;
    cout << myVec3Length(&LenVector) << endl;
 
    return 0;
}

 

벡터계산중 길이와 정규화 함수를 만들어 보았다.

 

 

Posted by JJOREG

AGP메모리


물음들 : 로컬(비디오) 메모리는 쓰기 속도가 느려서 잦은 갱신에는 적합하지 않고, 시스템 메모리는 그래픽카드쪽에서 읽는게 느려서 문제입니다. 그걸 해결하기 위한게 AGP메모리입니다.


꼭 그렇지는 않습니다. 사실 로컬(비디오) 메모리로 데이터의 Burst 전송이 AGP를 통해 필요할때마다 께작께작 가져가는 데이터보다 더 효율적이리라 추측하고 있습니다. 일단 같은 AGP를 통해 전송되고 한번에 많은 데이터를 보낼경우 주소나 정보를 Burst 해서 보낼 수 있으니까요. 그렇지만 한번 쓰고 버릴 Dynamic 데이터들을 비디오 카드로 전송해서 복사본을 만든다음 쓰는 것이 비효율적이기 때문에 AGP메모리가 사용됩니다. 


참고로 시스템 메모리는 그래픽 카드에서 바로 접근이 불가능합니다. 대부분 H/W들이 그렇지만 I/O 버스와 메모리 버스가 100% 맵핑되는 경우가 없고 데이터 전송에는 DMA에 그외 비슷한 특별한 조치가 필요한 것이죠. AGP 메모리가 그런 특별한 조치중 한가지로 시스템에서 허용한 메모리에 대해 CPU의 도움 없이 그래픽 카드가 멋대로(임의로?) 데이터를 읽어올 수 있는 획기적인(은 아닌것 같지만) 구성입니다. 시스템 메모리의 데이터를 특별한 방법을 사용하지 않고 그래픽 카드로 전송하려면 CPU의 보조가 필수적입니다. 


물음들 : AGP메모리는 일반 램에 영역을 잡아주는 것으로, CPU에서 쓰기속도와 그래픽카드쪽에서 읽기 속도(로컬 메모리보단 약간 느립니다.)가 빠릅니다. 대신 CPU에서 읽기속도는 느리므로 읽는 처리시에는 시스템 메모리가 좋겠지요.


하드웨어에 따라 다르지만 AGP 메모리보다 로컬(비디오) 메모리가 '매우' 빠릅니다. AGP 2X가 533MB/s 정도이고 8X가 대략 2GB/s 정도인데 GeForce 6800 Ultra 의 경우(사악한 비교대상입니다.) 33.6GB/s 의 내부 전송률을 갖고 있습니다. 뭐 하급 기종으로 가면서 절반, 또 절반씩 깍이는 속도이긴 하지만 절반이라 하더라도 AGP 8X의 무려 8배에 달하는 속도를 갖고 있습니다. 게다가!!! AGP 메모리는 시스템 메모리이기 때문에 CPU의 작업률이 올라가면 덩달아 AGP의 효율도 떨어지게 됩니다. 


그리고 AGP 메모리는 캐쉬가 되지 않는 메모리입니다. 간단히 말해서 CPU 캐쉬가 작동하지 않고 작은 메모리 단위로 여러번 읽어올 경우(C/C++코드를 생각하면 곤란하고 어셈 코드단위로 생각하세요.) 캐쉬가 작동하지 않기 때문에 물리적(전기적)으로 메모리에 여러번 접근을 하게 됩니다. 캐쉬를 쓰고 있을때는 크게 느껴지지 않지만 물리적인 메모리에서 데이터를 가져오는 시간은 수십 클럭 이상이 걸리기 때문에 4바이트 또는 12바이트 단위로 데이터에 접근할 경우 4바이트당 수십 클럭을 소모하게 됩니다. PCI도 크게 다르지 않은데 DDraw를 쓰면서 Surface 데이터를 바로 읽어서 알파 블렌딩을 해보신 분들은 무슨 뜻인지 금방 이해 하시리라 생각됩니다.


(메모리 구입시 4-4-4-12 같은 숫자가 바로 이 접근시 걸리는 시간입니다. 최악의 경우 '전부 더한다'정도의 메모리 클럭을 먹는다고 생각하시면 됩니다. CPU는 메모리 버스 클럭의 수배에서 수십배의 속도를 갖고 있으니 최악의 경우 4바이트 접근에 수백 CPU 클럭이 사용될 수도 있습니다.) 


p.s.AGP로 데이터 쓰기 작업에는 WC 버퍼라고 하는 녀석이 쓰여서 쓰기 속도 저하를 상당히 막아주고 있죠. 작은 쓰기 전용 캐쉬 같은거죠.

Posted by JJOREG

랜더링 파이프라인이란? ------------------------------------------------------------------------------------

 

기하학 적으로 가상의 3D장면을 구성하고 가상카메라를 설정한 다음 모니터에 2D 표현을 만들어 내는 과정을 랜더링 파이프 라인이라고 한다.

 

랜더링 파이프라인의 단계? ------------------------------------------------------------------------------------

 

객체 ------------------------------------------------------------------------------------

 

3d에서 어떠한 물체는 x y z의 좌표를 가져야 합니다. 이걸 기본 전체로 하나 하나의 물체는 자신을 이루는 면들과.

특정 위치를 가지는 녀석을 객체라고 하겠습니다. 즉 객체란 3차원 공간 상에서 x y z의 값을 가진 녀석입니다.

 

정점(VERTEX) 폴리곤 ------------------------------------------------------------------------------------

 

 

정점이란 간략하게 설명해서 3D 평면상에 존재하는 하나의 점을 의미합니다.

1개의 점은 말그대로 점 2개가 있으면 직선을 만들 수 있습니다. 

하지만 아직까지 3D 화면에서 보이기에는 그다지 적합하지 않은 형태입니다. 여기에 3개의 삼각형이생기게 됩니다.

세개의 정점이 만나서 생겨나는 면을 폴리곤이라고 생각해주시면 되겠습니다.

 

로컬 스페이스 ------------------------------------------------------------------------------------

로컬좌표란 어떠한 물체가 자신을 기준으로한 점이나 버텍스의 정보를 가진 상태로 외부 영향이 없는 상태라고 하겠습니다.

좀더 쉽게 설명하자면 무조건 0.0좌표를 기준으로 가지는 어떠한 객체를 가지고 얼마든지 그것을 늘리고 줄이고 회전시킬 수 있습니다.

즉 주변에 비교할만한 상대적 크기등이 없기 때문에 주변의 다른 객체를 고려하지 않고 모델링을 구현할수 있습니다.

현재까지는 아직 게임에 적용되지 않았다고 보면 됩니다.

월드 스페이스 ------------------------------------------------------------------------------------

 

하지만 모든 물체가 0.0에 존재한다면 모든 물체는 겹쳐있는 것처럼 보입니다.

일반적인 3d게임을 보면 객체와 객체 사이의 구분이 명확합니다.

 

 

 

사진을 보시면 말그대로 하나의 월드에 캐릭터와 나무 등이 배치되어 있는 것이 보일겁니다.

모두 x = 0, y = 0, z = 0의 위치가 아니라. 어떤 기준에 의해서 각 객체들이 각자의 좌표를 가지게 되는 것입니다.

즉 이미 어떠한 기준이 있고 그 기준에서 x y z축으로 얼마나 떨어져 있느냐를 정해준다면 그 객체는 3d 평면상에 객체가 되는 것입니다.

즉 처음의 객체는 0.0 0의 위치를 가지고 있지만 이것을 게임에 사용하기 위해서

하나의 기준 좌표를 가지고 100, 200, 100 <- 이런식으로 실제 배치될 좌표로 이동시키는 단계를 의미합니다.

 

이때 사용하는 함수로는 다음과 같은 함수들이 있습니다.

 

m_Transform.matWorld  -> 어떠한 객체의 행렬

 

D3DXMatrixTranslation(&m_Transform.matTrans, vPos.x, vPos.y, vPos.z); -> 월드 좌표의 이곳으로 이동시킨다.

 

pDevice->SetTransform(D3DTS_WORLD, &m_Transform.matWorld); -> 월드좌표를 기준으로 객체의 현재 행렬을 적용시킨다.

이때 알아두셔야 할것이 SetTransform이라는 함수는 내부에 등록된 월드 좌표들을 기록해 놓는다는 것입니다.

rander() -> 객체를 그린다.

 

뷰 스페이스 (3D 세상은 카메라를 중심으로 돈다.) ------------------------------------------------------------------------------------

 

3D세상에서 각 물체가 위치하고 있다고한다면 그것을 바라보는 눈이 존재할 것입니다.

 

관측되지 않으면 각 위치는 의미가 없습니다.

 

 

 

 

그렇다면 관측은 어떻게 하느냐? 카메라라는 존재가 있다고 생각하고 그 카메라가 위치와 바라보는 위치를 가지고 시야가 존재한다면

그 시야에 비치는 만큼을 3d화면에서 보고 있다고 할수 있습니다.

이때 카메라가 월드의 특정 위치나 방위를 가진다면 이후 있을 투영이나 클리핑 등의 작업이 오히려 연산을 더 사용하게 됩니다.

그래서 다이렉트에서는 카메라를 다시 원점으로 돌리고, 바라보고 있던 방향을 양의 z축을 바라보게 만듭니다.

즉 원점으로 돌리고 전방을 바라보고 회전시킨다는 것이죠.

하지만 카메라만 이동하면 현재 바라보고 있던 객체들은 보이지 않게 될 것입니다.

그러므로 모든 객체들에게 카메라가 이동한 만큼의 행렬을 이동시켜 주고 카메라를 중심으로 모든 행렬을 공전 시켜 줍니다.

즉 모든 객체는 카메라의 위치와 행렬값이 원점으로 돌아온 만큼 이동후 카메라를 중심으로 공전회전을 해줘야 합니다.

 

D3DXMATRIX Cammatrix

D3DXVECTOR3 vectorEye -> 월드 내의 카메라 위치

D3DXVECTOR3 vectorAt -> 월드 내의 카메라가 보는 지점

D3DXVECTOR3 vectorpUp -> 월드의 업백터(0, 1, 0)

 

D3DXMatrixLookAtLH(&Cammatrix, &vectorEye, &vectorAt , &vectorpUp) -> 카메라가 바라보는 시점을 기준으로한 뷰 스페이스 변환 행렬을 만들어 Cammatrix에 넣어준다.

 

pDevice->SetTransform(D3DTS_VIEW, &Cammatrix); 카메라의 행렬을 뷰 행렬로 장치에 세팅한다.

 

후면 추려내기  ------------------------------------------------------------------------------------

 

하나의 폴리곤은 앞면과 뒷면을 가지게 됩니다. 일반적으로 뒷면은 화면에 표시되지 않는 경우가 많습니다.

물론 뒷면도 출력할수 있지만 그렇다면 상당한 낭비라고 할수 있습니다. 일반적으로 게임에서 가장 많은 자원을 소비하는 것은 랜더링작업이며.

그 작업의 부담을 줄이기 위한 방법은 역시 출력하지 않을 것은 출력하지 않는게 최고 입니다.

후면추려내기 작업은 화면에 보이지 않는 면을 출력하지 않게 하는 작업입니다.

컴퓨터는 순차적인 처리를 하는 기계라 폴리곤을 면으로 만들때도 버텍스를 하나하나 읽어들여서 하나의 면을 출력합니다.

다음과 같이 모두 같은 방향으로 정점을 변환하다 보면 면이 뒷면일 경우 읽는 순서가 반대가 될 것입니다.

이러한 면들을 후면이라고 판단하고 추려내는 작업을 하는 것을 후면추려내기라고 합니다.

후면 추려내기는 디바이스를 통해서 옵션을 설정할 수가 있습니다.

 

 Device->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);

 

D3DRS_CULLMODE- > 추려내기작업에 대한 옵션을 설정하겠다는 키 입니다.

D3DCULL_CCW -> 반시계 방향으로 그려지는 면에 대해서 랜더링을 하지 않는 옵션입니다.

D3DCULL_CW -> 시계 방향으로 그려지는 면에 대해서 랜더링을 하지 않는 옵션입니다.

D3DCULL_NONE -> 추려내기를 하지 않습니다.

 

조명(빛이 있으라!!!)  ------------------------------------------------------------------------------------

 

우리가 눈으로 사물의 색과 빛 명암을 구분해낼 수 있는 것은 밫이 있기 때문입니다.

3D프로그래밍에서도 마찬가지 입니다. 각 면에 빛이 비춰져야 어떠한 색깔인지 모양을 가지고 있는지 알수가 있습니다.

조명이란 이렇게 폴리곤에 빛을 비춰서 반사되는 빛과 명암 색상을 만들어 내는 작업니다.

 

클리핑 ------------------------------------------------------------------------------------

 

앞서 후면 추려내기 작업에서 말씀했듯이 랜더링 작업은 많은 컴퓨터의 CPU나 GPU에 가장 많은 연산을 필요로 하는 작업입니다.

뷰스페이스까지 변환되었다면 화면에 보여져야할 폴리곤들이 있을 것입니다.

하지만 반대로 시야 바깥에 존재하는 보이지 않아야할 폴리곤들도 있을 것입니다.

클리핑이란 후면추려내기의 후면처럼 시야 밖에 보이지 않아야할 폴리곤들을 랜더링하지 않게 구분하는 작업을 의미합니다.

 

투영 ------------------------------------------------------------------------------------

클리핑 작업까지는 3D의 모든 작업이 진행되고 바라보는 카메라로 월드에서의 입체전환이 되어있는 상태를 의미합니다.

3D 세계에서 2D화면을 얻어내야 하는 작업이 남았습니다.

왜 어렵게 3D환경을 구성해 놓은걸 2D화면을 얻어내야 할까요?

모니터가 평면이기 때문입니다. 어차피 우리가 보이는 것은 모니터에 표시된 픽셀로 이루어진 2D화면을 보고 있는 것입니다. 즉 3D로 구현된 세상을

모니터로 옮기전에 2D화면으로 만드는 작업을 투영이라고 합니다. (아직 모니터에 옮긴 것은 아닙니다.)

투영작업은 투영좌표계라고 하는 특수한 좌표계로 옮겨지며 다음과 같은 좌표를 가지고 있습니다.

 

 

다음의 함수를 통해서 투영행렬을 꾸밀 수 있습니다.

 

D3DXMATRIX matProj 리턴받을 투영행렬을 받을 행렬의 주소값

FLOAT fFovy -> 시야각의 수직 영역 (라디안)

FLOAT fAspect -> 종횡비 = 너비 / 높이

FLOAT fNear -> 가까운 평면까지의 거리

FLOAT fFar -> 먼 평면까지의 거리

 D3DXMatrixPerspectiveFovLH(&matProj,  fFovy, fAspect, fNear, fFar);

 

뷰포트 변환 ------------------------------------------------------------------------------------

뷰포트란 투영된 각 이미지들을 모니터에 표시할수있는 크기로 다시 변환하는 작업을 의미합니다.

뷰포트를 통해서 화면의 해상도등을 정해줄수 있습니다.

또한 뷰포트 변환은 최종적으로 랜더링이 종료될때 장치에서 자동으로 처리해 줍니다.

 

 D3DVIEWPORT9 vp;

Device->GetViewport(&vp); -> 뷰포트를 가져오고

 

 vp.X = 100; -> 뷰포트를 다시 설정한다.
 vp.Y = 100;
 vp.Width = 300;
 vp.Height = 300;

 

Device->SetViewport(&vp); -> 뷰포트를 세팅한다.

 

래스터라이즈 ------------------------------------------------------------------------------------

스크린 좌표로 버택스들을 변환한다음 2d삼각형들이 그려지게 되는데. 말그대로 모니터의 픽셀하나하나를 계산해서 작업하게 되므로

엄청난 연산이 필요하게 됩니다. 그래서 반드시 전용 그래픽 하드웨어를 통해서 처리 되어야 합니다.

이 래스터 라이즈의 작업까지 끝이나야 모니터 화면에 표시되는 2d이미지가 표시됩니다.

 

Posted by JJOREG

D3DXMATRIX? ------------------------------------------------------------------------------------------------------------------


다이렉트X에서 하나의 객체를 표현하기 위해서 4X4의 행렬을 사용한다.
이 행렬이 대체 어떻게 하나의 객체의 위치와 회전을 가지게 되는지에 대해서는 아직 완벽히 파악하지 못하고 있다.
수학적으로 완벽한 이해가 선행되지 못하는 점이 아쉽지만 우선 그 사용법에 대해서는 차근차근 알아보자.

이동행렬 ------------------------------------------------------------------------------------------------------------------

4X4의 행렬에서 하단의 3개의 수치는 위치값을 나타낸다.

X Y Z의 세개의 축이 있으니 세개의 축의 위치를 표기하며 이는 일반적으로 벡터를 사용하여 표기한다.


회전행렬 ------------------------------------------------------------------------------------------------------------------



회전행렬은 일반적으로 X축 Y축 Z축의 회전으로 나누며 각 축에 맞춰서 시계방향으로 회전한 위치를 기준으로으로 각으로 본다.

세개의 회전행렬을 보면 알겠지만 하나의 축을 기준으로 회전하며 나머지 축에 대한 변화값을 주는 연산임이 보일것이다.

X축이란 말그대로 X축은 움직이지 않고 그 축을 중심으로 두고 회전함을 의미한다.


크기행렬 ------------------------------------------------------------------------------------------------------------------


대각 선 중앙의 값은 각 X축 Y축 Z축의 값을 의미한다.이 행렬의 값을 기준으로 -가 되면 축소되는 것이 아니라. 객체 자체가 뒤집히게 된다.

일반적인 축소연산은 1을 기준으로 0.9 0.8식으로 비율적으로 감소하게 되며 확대연산도 마찬가지로 적용된다.

Posted by JJOREG

행렬이란? -----------------------------------------------------------------------------------------------------------------------


 3차원의 물체를 나타낸다고 하면 다양한 고려사항이 필요하다.

 x y z의 축과 관련된, 회전, 위치, 크기등의 값이 존재할 것이다.

 거기에 이 파라미터들은 독립적인 파라미터가 아니라 서로가 서로에 영향을 미칠 수 있다.

 이러한 파라미터를 수학과 연계하여 좀더 압축적이고 보기 편하게 만든것을 행렬이라고 할수 있다.




행렬의 연산 ---------------------------------------------------------------------------------------------------------------------

상등 -> 행과 열이 같은 2개의 행렬이 있을때 같은 위치의 각 요소를 비교해 각 요소의 크기가 같다면 그 행렬은 상등한다고 한다.

스칼라 곱 -> 행렬에 하나의 수를 곱하는 것을 의미한다. 그 하나의 수를 행렬의 모든 요소에 곱해주면 된다.

행렬간 덧셈과 뺄셈 -> 행렬간 덧셈은 행렬과 행렬의 같은 행과 열을 가진 요소를 더하면 된다. 

* 만약 2개의 행렬간 차원에 차이가 있다면 덧셈과 뺄셈은 불가능하다.


행렬간 곱셈 -> 행렬간 곱셈은 한쪽 행렬의 열과, 한쪽 행렬의 행이 같은 차원을 가져야만 성립한다.

또한 일반적인 곱셈과 다르게 교환 법칙이 성립하지 않을수도 있다.(항상 성립하지 않는 것은 아니다.)

* 또한 곱셈은 행렬의 연산 중 가장 중요한 연산이다.


항등행렬 ---------------------------------------------------------------------------------------------------------------------


항등행렬이란 어떤 행렬에 곱해도 다시 같은 행렬이 나오는 행렬을 의미한다. 보는 바와 같이 행렬의 중앙 대각선을 1로 나머지는 0으로 채우면 된다.


역행렬 ---------------------------------------------------------------------------------------------------------------------

역행렬이란 행렬과 곱했을때 항등행렬이 되는 행렬을 말한다.



전치행렬 ---------------------------------------------------------------------------------------------------------------------

전치행렬이란 하나의 행렬의 행과 열을 바꾼 행렬이라고 생각하면 된다.


Posted by JJOREG

3D란? --------------------------------------------------------------------------------------------------

일단 3D에 대해서 이해해봅시다. 

THREE DIMENSIONS;

3D란 축이 3개가 존재하는 차원을 의미한다. 1차원은 점, 2차원은 선, 3차원은 면으로 이루어졌다고 생각하는 것이 아니라. 

서로 수직인 축을 기준으로 하여 하나의 면이 이루어 진다고 보면 된다.

수학적으로 봤을때 차원은 축이라는 개념으로 볼수 있다. 혹은 숫자로 표현할수 있는 하나의 행 또는 열로 표현이 가능하다.

컴퓨터는 수치를 통해서 연산을 처리하고 3차원은 3개의 축을 가진 공간으로 표현할 수 있다.


왼손좌표계 오른손 좌표계? ------------------------------------------------------------------------------------------


위에서 말한 내용을 세개의 축을 이미지를 통해서 확인해 보자. 

우리가 바라보는 방향을 생각했을때 왼손 좌표계는 Z축이 앞으로 전진한다고 생각하면 된다.

오른손 좌표계는 그 반대이다. Z축이 나를 향한다면 오른손 좌표계 이다.


벡터란? -----------------------------------------------------------------------------------------------------------


크기와 방향을 동시에 가진 값.


2차원 평면상의 점 P가 찍혀있다고 생각해보자. 

원점을 기준으로 했을때 하나의 선분이 점 P방향으로 X만큼 우측으로 이동하고 있고 Y만큼 상승하고 있다는 것을 알 수가 있다.

이는 점 P가 원점을 기준으로한 방향을 가지고 있다고 볼 수 있다.

그리고 하나의 점이 원점에서 부터 X만큼 Y만큼 크기를 가지고 이동하고 있다고 표현할수 있다.

방향과 크기를 동시에 가지고 있다고 할 수 있다.


그리고 2차원의 벡터에 Z축을 하나더 추가하면 3차원읠 벡터를 표시할 수 있다. 

이 벡터는 원점을 기준으로 X Y Z의 방향과 크기를 가지고 있다.



벡터의 상등 ------------------------------------------------------------------------------------------------------

벡터는 방향과 크기를 나타내는 개념이다. 

그렇다면 방향과 크기가 같지만 다른 벡터가 존재할 수 있을까?

존재할수 있지만 그 벡터는 서로 상등하다고 본다. 

방향과 크기가 같은 다른 벡터를 보고 상등한다고 표현한다.

위에서 보면 AB와 CD의 두개의 벡터가 존재한다. 두개의 백터는 상등하는 벡터이다.

출발점이 다른데 어떻게 같나요 라고 물어본다면...

다시한번 말하지만 벡터는 방향과 크기를 나타내는 개념이다.

현재로서는 벡터는 위치를 나타내는 개념이 아니다! 라고 이해해야 한다.


벡터의 크기계산 ------------------------------------------------------------------------------------------------------


기하학적으로 벡터는 크기와 방향을 가진 선분의 길이다. 

벡터의 성분(X,Y,Z)가 주어졌다고 할 때 다음과 같은 식을 이용해 벡터의 크기를 구할수 있다.



벡터의 정규화 ------------------------------------------------------------------------------------------------------


벡터의 정규화란 벡터의 크기를 1로 만들어 단위 벡터가 되도록 만드는 것을 의미한다.

다음과 같이 벡터의 각 성분을 벡터의 크기로 나누면 정규화가 된다.



벡터의 더하기 ------------------------------------------------------------------------------------------------------


크기와 방향을 더한다고 해서 어렵게 생각하지 말자. 

벡터의 덧셈에는 다양한 방법이 있지만 일반적으로 사용되는 방법을 확인해보자.

두개의 벡터의 시점과 종점을 연결하면 새롭게 하나의 벡터가 생겨나는게 그 벡터의 방향과 크기가 두벡터의 방향과 크기이다.


벡터의 뺄샘 ------------------------------------------------------------------------------------------------------

이번에는 반대로 뺄셈에 대해서 알아보자. 

두개의 백터의 뺄셈은 뒤에있는 백터가 앞에있는 벡터를 바라보는 벡터를 구할 수 있게 된다.

즉 백터 A와 B가 있고 A-B일때

B의 종점에서 A의 종점을 바라보는 방향을 얻을수 있다.


벡터의 스칼라 곱 ------------------------------------------------------------------------------------------------------

UV에 대한 속성을 곱할때 사용하는 값으로.

각 성분에 특정 수치를 더하는 것을 스칼라 곱이라고 하며 그때 곱하는 값이 음수면 벡터의 방향이 뒤집히게 된다.

10, 20, 30 의 수치를 가진 벡터가 존재할 때. 0.5를 곱하면 5, 10, 15의 수치를 가진 벡터가 나오게 된다고 생각하면 된다.


벡터의 내적 ------------------------------------------------------------------------------------------------------

내적은 벡터의 곱셈방식중 하나이며, UV로 표시되며 두 벡터 간의 내적이 벡터 크기 배율을 가진 벡터 간 각도의 코사인임을 할수가 있다.

백터의 내적은 매우 중요한 연산이므로 꼭 기억해 놓도록 해야한다.


벡터의 외적 ------------------------------------------------------------------------------------------------------

스칼라로 계산되는 스칼라곱, 내적과 달리 백터의 외적은 UXV로 표시되며 두 벡터에 수직인 벡터가 나오게 된다. 

즉 두개의 백터와 새로운 백터는 3차원 상으로 보면 90도 수직에 위치하게 된다.




Posted by JJOREG
이전버튼 1 이전버튼