728x90

Vector란? 

  - 방향과 크기를 가지는 직선. 기준점이 존재하지 않는다.

  - Point와의 차이점 :

        Point : 원점으로 존재. 위치와 관계 있음.

        Vector : 원점의 존재가 의미 없음. 이동량과 관계 있음.

 

Vector의 크기.

  - Vector의 정규화에 쓰인다.

    벡터의 크기 V = sqrt(power(x,2)+power(y,2)+power(z,2))

 

    기존에 2차원에서는 빗변이 크기가 되어서 크기 = sqrt(밋변제곱+높이제곱)이었다.

    ex)

    V = (1,2,3)

    ||V|| <,여기서 || || 이 표시는 벡터의 크기라는 표시이다.

    ||V|| = 루트(1제곱+2제곱+3제곱).

    ||V|| = 루트(1+4+9).

    ||V|| = 루트(14).

    그러므로 벡터의 크기 ||V||는 루트14가 된다.


Vector의 정규화.(Nomalize)

  - Vector의 크기를 1로 만들어 주는 것을 말한다. (Unit Vector라고도 한다.)

  - 크기는 고려하지 않고, 방향만 알고 싶을 때 사용한다.

 

    1) 축을 정의할 때.

    2) 삼각형을 바라보는 방향만이 필요할 때.

    3) Vector의 크기를 원하는 대로 바꾸고 싶을 때.

  

    ex)

    ^

    V = ( x / ||V||, y / ||V||, z / ||V||)

 

Vector의 내적.(Dot Product)

  - Vector A = (a1, a2, a3)

  - Vector B = (b1, b2, b3)

  - A Dot B = (a1 * b1) + (a2 * b2) + (a3 * b3) (실수 값 하나가 나온다.)

  - theta = Vector A와 Vector B의 사이각.

  - A Dot B = ||A|| * ||B|| * cos(theta)

  - 내적은 어디에 사용되는가?

    1) 두 벡터의 사이 각을 구할 때.

    2) 점과 선 사이의 거리를 구할 때.

    3) 점과 평면 사이의 거리를 구할 때.

    4) 빛을 어느정도 받는지 계산할 때. (Normal과 Light와의 Dot Product) - 램버트 Light

    5) 하나의 Vector를 다른 벡터에 투영 시킬 때.

    6) 물체가 특정 평면에 부딪힌 후의 팅겨오르는 것을 계산하기 위한 반사 Vector를 구할 때.

 

Vector의 외적.(Cross Product)

  - Vector A = (a1, a2, a3)

  - Vector B = (b1, b2, b3)

  - A Cross B = ((a2 * b3 - a3 * b2), (a3 * b1 - a1 * b3), (a1 * b2 - a2 * a1)) (벡터가 나온다.)

  - 외적은 어디에 사용되는가?

    1) 두 벡터에 수직인 벡터를 만들어 낼 때.

    2) 두 벡터로 둘러싸인 평행 사변형의 면적을 구할 때.

    3) 어떤 점이 삼각형에 포함되어 있는가를 계산 할 때.


출처 : http://blog.naver.com/neoplog/50046003021

728x90

'Math' 카테고리의 다른 글

Math - 동차 좌표계  (0) 2017.04.20
Math - 점과 점 사이의 각도 구하기  (0) 2017.04.19
Math - 점과 점 사이의 거리 구하기  (0) 2017.04.19
Math - Radian과 Degree  (0) 2016.05.19
Math - 정반사 벡터  (0) 2016.03.07
728x90

-동차좌표계란?

 3D에서는 기본적으로 3차원좌표계이지만 어떤 목적에 의해 4차원으로 확장할 수 있는데, 이것이 동차좌표계다. 기본적인 성분 x, y, z에 w가 추가된 것으로 3D상에서는 x/w, y/w, z/w로 나타낸다. 동차좌표계가 있음으로 오브젝트의 이동을 행렬간 곱셈으로 표현할 수도 있으며, 포인트(w=1)와 벡터(w=0)를 가늠할 수 있는 기준이 되기도 한다.


-동차좌표계와 투형행렬

 투영행렬에서, 카메라공간상에 존재하는 점과 카메라 위치 사이의 깊이값(z)를 최종 결과점의 x, y, z에 각각 곱해지고, w에 저장되는데 바로 이 과정이 동차좌표계를 위한 과정이다. 해당 좌표공간(카메라공간, 투영공간, 월드공간 등등)에서의 3D좌표를 얻어내려면 w로 나눠내면 된다. 여기서 월드공간, 카메라공간에서는 w값이 항상 1이기 때문에 아무런 변화가 없지만, 투영공간에서는 w값이 카메라공간에서의 카메라의 위치에서부터 정점사이의 거리이기 때문에 z값에 따라 정점의 위치와 크기가 변환되는 것임을 짐작할 수 있다. 따라서, 셰이더에서 다른 공간은 별로 상관없지만, 투영공간상에 존재하는 좌표를 다룰 경우 동차좌표계상에 존재하기 때문에 w성분으로 나누어 줘야한다. 

[푸의 요약]
 라이푸의 큐티한 그림을 보자면-_- 별은 카메라, 파란선은 전방 후방 클립면, 검은색네모는 버텍스이다. 만약 우리가 삼각형을 그
리기위해서 버텍스를 입력하게되면 w=1 이다. 이것이 버텍스셰이더를 거치게되면서 w값이 변경된다. 정확히 말하면 프로젝션매트릭스를 거치기전까지 w=1을 유지한다. 프로젝션을 거치게되면(버텍스셰이더를거치게되면) 현재 카메라좌표와 버텍스간의 거리값이(깊이값) w에 저장하게 되고 x,y,z에도 곱해진다. 이런 역할을 하는 것이바로 동차좌표계이다. w=1이라는 규약은 전후방 클립면의 총거리를 1로 나타내는 것이다. 그렇다면 동차 좌표계를 실제로 사용되는 곳이 어딜까? 셀프셰도우 구현시 DepthMap을 렌더타겟에 그리게 되는데 이때 버텍스셰이더에서 mal(vPOS, mWVP) 정보를 픽셀셰이더에서 이를 vPos.xyz / vPos.w로 나누어 3D상에서 실제좌표를(Z깊이값) 얻어 낼때 사용된다. 더 정확하게 말하면 버텍스셰이더에서 Z값이 아닌 픽셀셰이더를 거쳐 선형보간된 Z값을 얻을 때 사용되는 것이다. 그리고 디퍼드 구현때도 G-Buufer에서 Original View Position을 픽셀셰이더에서 재건할때도 동일한 원리를 적용하여 vPos.xyz / vPos.w값을 사용하게 된다. 




[References]
http://neosafe.blog.me/130044604300
http://ekessy.tistory.com/2


출처 : http://liepooh.egloos.com/521832#comment_521832

728x90

'Math' 카테고리의 다른 글

Math - 벡터 (Vector)  (0) 2017.04.20
Math - 점과 점 사이의 각도 구하기  (0) 2017.04.19
Math - 점과 점 사이의 거리 구하기  (0) 2017.04.19
Math - Radian과 Degree  (0) 2016.05.19
Math - 정반사 벡터  (0) 2016.03.07
728x90

두 점 사이의 각도 구하기


직각 삼각형의 두 변의 길이를 Rx, Ry라고 할 때 arc tangent를 사용하여 각도 Θ를 구하는 방법. (이 때 Θ는 Radian)




double GetAngle(Vector2 v1, Vector2 v2)

{

    double xdf = v2.x - v1.x;

    double ydf = v2.y - v1.y;


    double radian = atan2(ydf, xdf);

    double degree = radian * 57.3f;   // 57.3f == (180.0f / 3.141592f);


    return degree;

}



응용을 한다면 Pixel 셰이더에서 텍스처의 중심과 Pixel의 각도를 계산해서 아래와 같은 텍스처 애니메이션을 구현할 수 있습니다.





728x90

'Math' 카테고리의 다른 글

Math - 벡터 (Vector)  (0) 2017.04.20
Math - 동차 좌표계  (0) 2017.04.20
Math - 점과 점 사이의 거리 구하기  (0) 2017.04.19
Math - Radian과 Degree  (0) 2016.05.19
Math - 정반사 벡터  (0) 2016.03.07
728x90

두 점 사이의 거리는 피타고라스의 정리를 사용하여 구할 수 있다.


거리는  와 같이 제곱과 제곱근을 이용하여 구할 수 있다.



double GetDistance(Vector2 v1, Vector2 v2)

{

    double xdf = v2.x - v1.x;

    double ydf = v2.y - v1.y;


    return sqrt(pow(xdf, 2), pow(ydf, 2));

}



응용을 한다면 Pixel 셰이더에서 텍스처의 시작 위치와 Pixel의 위치를 계산해서 아래와 같은 텍스처 애니메이션을 구현할 수 있습니다.






728x90

'Math' 카테고리의 다른 글

Math - 동차 좌표계  (0) 2017.04.20
Math - 점과 점 사이의 각도 구하기  (0) 2017.04.19
Math - Radian과 Degree  (0) 2016.05.19
Math - 정반사 벡터  (0) 2016.03.07
Math - 피타고라스의 정리  (0) 2016.03.07
728x90

우리가 일상적으로 사용하는 각의 단위는 디그리(degree)입니다. 즉, 원 한바퀴를 360도로 표현하는 방법입니다. 반원은 180도, 직각은 90도 등 degree는 우리에게 매우 익숙한 각의 단위입니다.

 

그런데, 각을 표현하는 다른 방법으로 라디안(radian)이 있습니다. 보통 라디안은 부채꼴의 중심각을 가지고 설명되는데, 아래 그림과 같이 호의 길이가 반지름과 같게 되는 만큼의 각을 1 라디안(radian)이라고 정의합니다.

 


 

정의에 따르면 왠지 라디안은 반지름에 대한 상대적인 각도의 단위처럼 생각됩니다. 하지만 radian은 degree처럼 절대적인 각도의 단위입니다. 실제로 1 radian은 약 57.3도에 해당하는 각입니다. 그러면 2 radian은 약 114.6도가 되겠지요. 여기서 우리는 degree보다는 radian이 훨씬 큰 각의 단위라는 걸 알 수 있습니다.

 

반지름이 3이고 중심각이 2 radian인 부채꼴이 있습니다. 그러면 이 부채꼴의 호의 길이는 얼마일까요? radian의 정의에 의해 답은 6입니다. 반지름과 중심각의 크기만 알면 호의 길이를 이렇게 쉽게 구할 수 있다는게 신기하지 않나요? 반대로, 호의 길이가 6이고 반지름이 3인 부채꼴이 있다면 이 부채꼴의 중심각은 얼마일까요? 바로 2 radian입니다. 즉, 약 114.6도입니다. 부채꼴 도형에서 반지름, 중심각, 호의 길이 3가지 중에 2가지만 알면 다른 한가지는 곧바로 구할 수 있게 됩니다.


자동차가 달리고 있는데 오른쪽으로 10도 틀으라고 하면 대략 얼마나 돌려야 할지 감이 올 것입니다. 그런데, 만일 오른쪽으로 0.5 radian 돌려라고 한다면 도대체 이게 어느 정도의 각인지 도무지 감이 오지 않을 것입니다. 이와 같이 우리에게 친숙한 각의 단위는 degree입니다.

 

그러면, 우리에게 친숙한 degree로만 각을 표현하면 좋을텐데 왜 이렇게 복잡하게 radian이라는 것을 도입해서 문제를 어렵게 하는 걸까요? 사실 저도 이유는 잘 모릅니다. 하지만 분명한 것은 우리 사람이 선호하는 각 체계는 degree인 반면 컴퓨터나 수학에서 주로 사용되는 각 체계는 radian이라는 것입니다. 그래서 표준을 정하거나 공동작업을 할 때 종종 각을 어떻게 표현할 것인가를 두고 사람들끼리 논쟁이 일어나기도 합니다. 사람을 중심에 놓고 생각하는 사람들은 degree를 사용하자고 주장하고, 다른 한편에서는 어차피 컴퓨터에서는 radian으로 고쳐서 사용해야 하기 때문에 계산의 효율성을 위해서 radian을 사용하자고 주장합니다.

 

컴퓨터에서 프로그램을 개발할 때에도 degree와 radian을 변환하는 일이 수시로 발생합니다. 사용자에게 각을 입력받을 때는 보통 degree로 입력받은 후 이를 내부적으로 radian으로 고쳐서 필요한 계산을 수행합니다. 그리고 계산된 결과를 보여줄 때는 다시 사람에게 친숙한 degree로 변환하여 보여줍니다. 이러한 변환작업은 사실 번거롭긴 하지만 어쩔 수 없는 일이기도 합니다.

 

그렇다면 degree와 radian은 어떤 변환 관계를 가지고 있을까요? 180도는 π radian입니다. 여기서 π(파이)는 3.1415926535... 의 값을 갖는 무한소수로 원주율(원의 지름에 대한 원주의 비)을 말합니다. 이 관계식을 이용하면 다음과 같이 자유롭게 degree와 radian의 단위를 변경할 수 있습니다.

 

180 degree = π radian

1 degree = π / 180 radian

x degree = x * π / 180 radian

 

π radian = 180 degree

1 radian = 180 / π degree

x radian = x * 180 / π degree

 

좀전에 자동차 예에서 나온 0.5 radian을 위 수식을 이용하여 degree로 고치면 0.5 * 180 / 3.1415926535 = 28.64788... degree 정도가 됩니다. 그러나, 수식을 이용하지 않고도 대략적인 radian의 값을 파악하는 방법이 있습니다. 그건 먼저 머리속에서 부채꼴을 하나 상상합니다. 그 부채꼴의 호의 길이는 반지름과 같은 길이를 갖도록 합니다. 그러면 그 부채꼴의 중심각이 1 radian입니다. 이제 0.5 radian을 구하고 싶으면 상상속의 그 부채꼴의 중심각을 2등분하면 됩니다. 그러면 대략적으로 0.5 radian이 어느정도의 각인지 알 수 있을 것입니다.

 

 

변환 방법.

1. 라디안->디그리으로 변환공식

 - 180.0f/NI_PI * (라디안) = 디그리

 

2. 디그리->라디안으로 변환공식

 - NI_PI/180.0f * (디그리) = 라디안

 

#define RadToDeg(x) (57.29577951 * x)

#define DegToRad(x) (0.017453293 * x)

 

360도는 라디안 값으로-> 360 * DegToRad = 6.28318548(2π)

다시 디그리 값으로->6.28318548 * RadToDeg = 360

 

출처 : http://darkpgmr.tistory.com/26

         http://blog.naver.com/yooglory?Redirect=Log&logNo=110067469483

728x90

'Math' 카테고리의 다른 글

Math - 동차 좌표계  (0) 2017.04.20
Math - 점과 점 사이의 각도 구하기  (0) 2017.04.19
Math - 점과 점 사이의 거리 구하기  (0) 2017.04.19
Math - 정반사 벡터  (0) 2016.03.07
Math - 피타고라스의 정리  (0) 2016.03.07
728x90

정반사는 입사벡터와 반사벡터의 크기가 같고, 입사각과 반사각의 크기가 같은 것을 말한다.


Fig.1 을 보면 입사벡터 P 와 법선벡터 n 이 주어졌을때, 반사벡터 R 은 벡터 P 와 크기가 같고, 입사각과 반사각이 같음을 확인할 수 있다. 

여기서는 P 와 n 만으로 반사벡터 R 을 구하는 방법을 알아보자.


우선, 입사 벡터 P 의 역벡터 -P 를 n 의 연장선상에 투영시켜

투영벡터 n(-P·n) 를 구한다.

입사 벡터 P 의 시작 위치를 원점에 위치시키고, 여기에 n(-P·n) 를 더하면, 입사면에 투영된 벡터의 위치를 구할수 있다.

Fig. 3 을 보면, 입사벡터 P 에 n(-P·n) 를 1번 더하면, 입사면에 투영된 위치를 구할 수 있고, 2번 더하면  반사벡터 R 을 구할 수 있음을 알수 있다.

결국, 반사벡터 R 은 R = P +  2n(-P·n)  


출처 : http://blog.naver.com/PostView.nhn?blogId=qnwk111&logNo=80144623306 


728x90

'Math' 카테고리의 다른 글

Math - 동차 좌표계  (0) 2017.04.20
Math - 점과 점 사이의 각도 구하기  (0) 2017.04.19
Math - 점과 점 사이의 거리 구하기  (0) 2017.04.19
Math - Radian과 Degree  (0) 2016.05.19
Math - 피타고라스의 정리  (0) 2016.03.07
728x90

피타고라스의 정리.

 - 직각삼각형에서 직각을 낀 두 변의 길이의 제곱의 합은 빗변의 길이의 제곱과 같다.



피타고라스의 증명.

∠A가 직각인 삼각형 ABC에서  b2+c2=a2 임을 증명해보자.

[가정] △ABC에서, ∠A=∠R

[결론] b2+c2=a2

[증명] 아래쪽 그림과 같이 b+c를 한 변으로 하는 정사각형 ADEF를 만들고,

 인 점 G, H를 잡는다.



△ABC, △DGB, △EHG, △FCH

는 모두 합동인 직각삼각형이다. 그러므로


………………………①

∠BCA+∠HCF=∠R이므로

∠HCB=∠R …………………………………………②

①,② 식에서 사각형 CBGH는 한변의 길이가 a인 정사각형이므로

 □ADEF = □CBGH + 4×△ABC

그러므로  (b+c)2 = a2 + 4×(bc/2)

   b2 + 2bc + c2 = a2 + 2bc

따라서 b2+c2=a2


출처 : http://math.kongju.ac.kr/math/lrn/3pldl1.html


728x90

'Math' 카테고리의 다른 글

Math - 동차 좌표계  (0) 2017.04.20
Math - 점과 점 사이의 각도 구하기  (0) 2017.04.19
Math - 점과 점 사이의 거리 구하기  (0) 2017.04.19
Math - Radian과 Degree  (0) 2016.05.19
Math - 정반사 벡터  (0) 2016.03.07

+ Recent posts