728x90

법선 벡터( 면에 수직인 벡터 )의 변환의 경우 일반적인 정점의 matrix를 그대로 사용하면 안된다.

법선 벡터 예시

실제로 단순 vertex를 월드 좌표로 옮길때 "world marix"라 부르는 SRT ( 스케일, 회전, 이동 ) 이 적용된,

matrix를 사용하게 되는데, 법선 벡터도 동일하게 world matrix를 사용하면 "직교성"을 잃어버린다.

(실제로 손으로 계산하면 바로 알 수 있다.)

월드 좌표로 변환 예시

그럼 어떤 matrix를 곱해야 월드 좌표로 옮겨도 직교성을 유지할 수 있을까??

W, world matrix

결론부터 얘기하면, world matirx의 역 전치를 곱하면 된다.

예를 들어 삼각형의 위의 벡터 V가 있고, 법선 벡터를 N이라 하자. ( N · V = 0, 직교하므로)

월드 좌표로 변환된 두벡터의 내적은 여전히 0이어야 한다. 따라서,

 

Nt · Vt = (T N) · (W V) = 0 이다.  이때 T를 구하면 된다.

 

(T N) · (W V) = trans(T N) (W V) = trans(N) trans(T) W V = 0 인데, ( trans()는 전치 )

 

trans(N) V = 0이므로, trans(T) W가 단위 행렬이 되면 된다.

 

따라서, trans(T) = inv(W)   =>  T = trans( inv(W) )  

 

 

728x90
728x90
원문 : http://mycom333.blogspot.kr/2014/01/axis-angle-rotation.html

위 블로그를 기초로 나름대로 정리해보았다. 정리라 쓰고 복사라 읽는다.



3차원 공간에서 i=(1,0,0), j=(0,1,0)일때  i를 Z축에 대해 회전시키면 다음과 같이 나타낼 수 있다.



이는 xy평면상의 회전과 같습니다.


이 식을 이용하여 i, j대신 v_perp, w를 사용하고 회전축은 A를 사용하겠습니다.





v_proj : 벡터 v를 A축에 대해 projection

v_perp : 벡터 v를 A축에 대해 perpendicular



위 식을 이용해 회전된 v_perp에 v_proj를 더하여 회전된 v를 얻을 수 있다.


즉 회전된 v는 다음과 같다.




먼저 v_proj부터 구하면


:  A의 unit vector


일때


이다.


v_perp + v_proj = v 로 v_perp를 구할 수 있다.




w는 회전축 A와 v의 외적으로 구해진다.



지금까지 구해진 것들로 식을 다시 쓰면




v를 분리하여 (행렬 * 벡터) 식으로 만들기 위해 tensor product와 skew matrix를 사용하여 정리합니다.



[tensor product]


두 벡터 v, w에 대해



세 벡터 u, v, w에 대해 다음 식이 성립한다.


(계산해보면 쉽게 알 수 있다.)



[skew matrix]


벡터 v, w의 외적을 skew matrix로 변환하여 행렬 * 벡터로 바꿀 수 있다.




이제 식을 정리하면


I : identity matrix



벡터 v를 분리 했으니 회전행렬 R이 될 부분을 정리하면





이 유도된 행렬을 이용하여 임의의 축 A를 기준으로 임의의 벡터 v를 회전시킬 수 있습니다.


728x90

'수학' 카테고리의 다른 글

법선 벡터의 변환  (0) 2022.01.02
선형 보간(lerp)과 구면 선형 보간(slerp)  (0) 2016.06.11
로지스틱 함수  (0) 2016.03.17
Perspective Projection Matrix(원근 투영 행렬)의 유도  (0) 2016.01.31
오일러 공식(Euler fomula)  (0) 2016.01.05
728x90

선형 보간 법



사원수의 선형 보간:




<벡터의 선형 보간 ( 0 <= t < 1)>



정규화를 해주면 두 점사이 가장 짧은 호를 따라가는 보간을 얻을 수 있다.





<선형 보간 결과(파란색)정규화된 결과(보라색)>




구면 선형 보간 법



선형 보간의 경우 계산이 빠르지만 두 점 사이 직선을 통과하기 때문에 


애니메이션에서 일정한 부드러운 애니메이션을 그릴 수 없다.


위 그림은 선형 보간과 선형 보간의 정규화를 나타내는데


선형 보간을 보면 t의 값을 일정하게 증가시킬때 (파란색)


정규화된 점은 호의 길이가 제각각으로 다르다. (연보라색)



그래서 두 점사이 각을 일정하게 보간하는 구면 선형 보간 법을 쓴다.



0 <= t <= 1 인 단위원(반지름 1)에서 두 점 사이 보간 결과를 r 이라고 하면


이다. n을 먼저 구하면


이고 반지름이 1이기 때문에 이므로


이고 m도 같은 방식으로 구하면 (m에서 벡터P1에 수선을 내려 똑같이 하면된다.)


이고 대입하면




 이다.

728x90

'수학' 카테고리의 다른 글

법선 벡터의 변환  (0) 2022.01.02
임의의 축 회전 (Axis Angle Rotation)  (0) 2016.09.30
로지스틱 함수  (0) 2016.03.17
Perspective Projection Matrix(원근 투영 행렬)의 유도  (0) 2016.01.31
오일러 공식(Euler fomula)  (0) 2016.01.05
728x90

로지스틱 함수


독립 변수(hypothesis에서 x, 즉 feature)가 [-∞,∞]의 어느 숫자이든 상관 없이 종속 변수(y) 또는 결과 값이 항상 범위 [0,1] 사이에 있도록 한다. 이는 오즈비(odds ratio)를 로짓(logit) 변환을 수행함으로써 얻어진다.



 \text{odds ratio} = \frac{p(y=1|x)}{1-p(y=1|x)}


성공확률이 실패할 확률보다 얼마나 높은가에대한 비율이다.



 \operatorname{logit}(p) = \log\frac{p}{1-p}

odds ratio에 로그를 취한 형태의 함수로 입력값이  [-\infty,+\infty]일 때 출력 값의 범위를 [0,1]로 조정한다.


logit 변환의 그래프



로지스틱 함수는 선형 회귀(linear regression)에서 비롯되었다.


그래서 로지스틱 회귀에서 로짓 변환의 결과와 선형 예측 함수(coursera에서 hypothesis)의 결과값이 같다.


그러므로  \ln\frac{p_i}{1-p_i} = \beta\centerdot X_i 으로 표현할 수 있다.


따라서 구하고자 하는 특정 독립 변수 x가 주어졌을 때 종속 변수가 1인 카데고리에 속할 확률은


p_i = \operatorname{logit}^{-1}(\boldsymbol\beta \cdot \mathbf{X}_i) = \frac{1}{1+e^{-\boldsymbol\beta \cdot \mathbf{X}_i}} 이다.



logistic 함수

--------------------------------------------------------------------------------------------------------------------

위키백과


728x90
728x90

원문 : http://www.songho.ca/opengl/gl_projectionmatrix.html

Overview

컴퓨터 모니터는 평면이다. OpenGL에서 렌더링된 3d장면은 2d이미지로 컴퓨터 스크린에 투영되야 한다. GL_PROJECTION 행렬은 이 투영변환에 사용된다. (OpenGL 2.0부터 쉐이더를 사용하므로 투영행렬로 생각하자.) 처음에 투영행렬은 모든 vertex data를 카메라 좌표로부터 clip좌표로 변환시킨다. 그리고 이 clip좌표는 또한 w요소로 나누는 것에 의해 normalized device coordinates (NDC, 정규좌표)로 변환된다.

A triangle clipped by frustum 
A triangle clipped by frustum

따라서 우리는 NDC 변환과 clipping(절두체 자르기?)가 투영행렬로 통합되는 것을 기억해야한다. 앞으로의 섹션들은 left, right, bottom, top, nearfar 이 6개의 파라미터들로 부터 어떻게 투영행렬을 얻는지 설명한다.

clipping은 wc로 나누기 전에 clip좌표에서 수행된다는 것을 기억해라. clip좌표 xc, ycand zc 는 wc와 비교함으로 테스트된다. 어떤 클립좌표가 -wc보다 작거나 wc보다 크면 그 vertex는 폐기될 것이다.

그러면 OpenGL은 클리핑이 발생하는 다면체의 면을 재구성할 것이다.

Perspective Projection

OpenGL Perspective Frustum and NDC 
Perspective Frustum and Normalized Device Coordinates (NDC)

원근 투영에서 끝이 잘린 피라미드내 한 3차원 점은 큐브(NDC)로 매핑된다. x축 좌표계의 범위는 [l, r] 에서 [-1, 1]로 y는 [b, t]에서 [-1, 1]로 그리고 z는 [n, f]에서 [-1, 1]로 (왼쪽 그림과 같이)

카메라 좌표계는 오른손 좌표계에서 정의되지만(opengl이라서) NDC는 왼손 좌표계를 사용한다. 이것은 원래 카메라는 -Z축을 바라보지만 NDC에서는 +Z축을 바라보는것을 의미한다. glFrustum()는 near, far 거리값을 양수만 취하기 때문에 투영행렬을 유도하는 동안 부호를 바꿀 필요가 있다.

OpenGL에서 카메라공간상의 한 점은 near평면으로 투영된다. 아래 그림은 어떻게 카메라공간상에서 점(xe, ye, ze)가 near평면 위 (xp, yp, zp)로 투영되는지 보여준다.

Top View of Frustum 
Top View of Frustum
Side View of Frustum 
Side View of Frustum

절두체를 위에서 볼때 xe는 삼각형의 닮음비에 의해 계산된 xp로 매핑된다.

옆에서 볼때 yp 또한 같은 방식으로 계산한다. 

xp와 yp는 ze에 의존한다. 역으로 둘다 -ze에 비례한다. 즉 둘다 -ze로 나눠진다. 이는 투영행렬을 유도하는데 중요한 첫 단서이다. 카메라 좌표가 투영행렬을 곱함으로 변환된 이후에 클립 좌표는 여전히 동종의 좌표이다. 클립 좌표의 w요소로 나누는것으로 정규좌표(NDC)가 된다. (See more details on OpenGL Transformation.
Clip Coordinates ,  Normalized Device Coordinates

그러므로 우리는 클립 좌표의 w요소를 -ze으로 설정할 수 있다. 그러면 투영행렬의 4번째 행은 (0, 0, -1, 0)이 된다. ([-1, 1]로 매핑되기 때문이며 이 값으로 나누어 NDC로 변환된다.) 

그 다음에 xp와 yp를 NDC의 xn와 yn으로 선형관계에서 매핑한다. [l, r] ⇒ [-1, 1] and [b, t] ⇒ [-1, 1].

 
Mapping from xp to xn

 

 
Mapping from yp to yn

 

xp와 yp를 위 방정식으로 교체한다.

원근 분할(xc/wc, yc/wc)에 대해 -ze로 나누어지는 두 방정식을 얻었다. 그리고 wc를 미리 -ze로 설정했다. 위 방정식의 괄호 안 부분들이 클립 좌표의 xc, yc가 된다.

이것으로부터 우리는 투영행렬의 첫번째행과 두번째행을 구할 수 있다.

이제 투영행렬의 세번째행만 남았다. zn를 구하는 것은 조금 다르다. 왜냐하면 카메라 좌표상의 ze는 항상 near평면의 -n으로 투영되기 때문이다. 하지만 우리는 클리핑과 깊이 테스트를 위한 특별한 z값이 필요하다. 또 unproject(역변환. 투영행렬의 역행렬을 취하여 투영되기 전의 점을 구하는 듯)을 할 수 있어야 한다. z가 x나 y값에 의존하지 않는 것을 알기 때문에 zn ze사이 관계를 알기 위해 w요소를 차용한다. 그러면 이런식으로 투영행렬의 세번째 행을 명시할 수 있다. 

카메라 공간에서 we는 1이므로 방정식은 이렇게 된다.

계수 A, B를 구하기 위해 (ze, zn)의 관계 (-n, -1)와 (-f, 1)를 이용한다. 그리고 위 방정식에 넣어서 연립장정식을 풀 수 있다.

A와 B에 대해 방정식을 풀기 위해 (1)식을 B에 대하여 다시 쓰면

식(1')을 식(2)의 B로 교체하여 A에 대하여 풀면

구한 A를 식(1)에 넣어서 B를 구한다.

A와 B를 구했으므로 zezn사이 관계는 이렇게 된다.

마침내 투영행렬 전체를 구하였다. 완성된 행렬의 모습이다.
OpenGL Perspective Projection Matrix 
OpenGL Perspective Projection Matrix

이 투영 행렬은 일반적인 절두체에 대해서이다. 만약 viewing 공간이 좌우 대칭 즉,  and 이면 이렇게 간략하게 표현할 수 있다.


마치기 전에 식(3)의 ze, zn관계를 다시 한 번 보기 바란다. 관계가 비선형관계이며 유리함수라는 것을 알 수 있다. 이것은 near평면에서 매우 정확하지만 far평면에서는 매우 부정확하다는 것을 의미한다. 만약 [-n, -f]범위가 매우 크다면 깊이 정확도 문제(z-fighting)를 초래할 수 있다. far평면 근처에서 ze의 작은 변화는 zn값에 영향을 미치지 않는 문제이다. z-fighting을 최소화하기 위해 가능한한 near와 far사이 거리는 작아야 한다.

Comparison of depth precision 
Comparison of Depth Buffer Precisions

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


국어도 못하는데 외국어를 번역하려하니 어려운 것 같다.


728x90

'수학' 카테고리의 다른 글

임의의 축 회전 (Axis Angle Rotation)  (0) 2016.09.30
선형 보간(lerp)과 구면 선형 보간(slerp)  (0) 2016.06.11
로지스틱 함수  (0) 2016.03.17
오일러 공식(Euler fomula)  (0) 2016.01.05
벡터의 외적과 삼중곱  (0) 2015.06.26
728x90

아래와 같은 모양의 오일러 공식은 1748년 오일러가 무한급수의 좌우 극한값이


같음을 증면하면서 발표되었다. (위키백과)



e^{ix} \,=\, \cos x + i\sin x


(여기서, e는 자연로그의 밑인 상수이고, i는 제곱하여 -1이 되는 허수단위이다.)



위 식의 x 에 파이를 넣으면


e^{i \pi} + 1 = 0 라는


"오일러 등식"을 얻을 수 있다.


또한


오일러 공식에서 x 에 a+b를 넣으면



이 된다.


위 식은 이렇게도 표현 할 수 있다.



식을 정리하면



이 되므로 




으로 삼각함수의 덧셈정리를 증명할 수 있다.

728x90
728x90

벡터곱


두 벡터 \mathbf{a} 와 \mathbf{b}의 벡터곱은 \mathbf{a} \times \mathbf{b}라 쓰고, 다음과 같이 정의된다. (위키백과)


\mathbf{a} \times \mathbf{b} = \hat{\mathbf n} \left| \mathbf{a} \right| \left| \mathbf{b} \right| \sin \theta



단위벡터 n은 벡터a와 벡터b에 공통수직으로 아래 그림과 같이 두개가 나온다.


 


해서 좌표계에 따라 정한다. (위 그림은 오른손 좌표계. 나사 돌리듯 벡터a에서 벡터b로 회전한다고 생각하면 된다.)


Left-handed and right-handed coordinate systems. Source: http://viz.aset.psu.edu/gho/sem_notes/3d_fundamentals/html/3d_coordinates.html

Left-handed and right-handed coordinate systems. Source: http://viz.aset.psu.edu/gho/sem_notes/3d_fundamentals/html/3d_coordinates.html

opengl(오른손좌표계), directx(왼손좌표계)



벡터a와 벡터b사이의 각을 계산할 필요없이 행렬식을 이용하여

아래 행렬의 1행에 대한 "여인수(cofactor)"를 전개하면 벡터의 좌표를 구할 수 있다.

(i x j = k, j x k = i, k x i = j 인 단위벡터)


\mathbf{a}\times\mathbf{b}=\det \begin{bmatrix} 
\mathbf{i} & \mathbf{j} & \mathbf{k} \\
a_1 & a_2 & a_3 \\
b_1 & b_2 & b_3 \\
\end{bmatrix}



\mathbf a \times \mathbf b = [a_2 b_3 - a_3 b_2, a_3 b_1 - a_1 b_3, a_1 b_2 - a_2 b_1] 이 된다.



#############################################################################################

                                                             외적의 크기

#############################################################################################



벡터 삼중곱


(라그랑주 공식)

증명:

--------------------------------------------------------------------------------------------------

그림출처 : http://ko.wikipedia.org/wiki/벡터곱

728x90

+ Recent posts